HTML Renderer
The HTML renderer generates complete, interactive forms from parameter metadata with built-in validation and styling.
Basic Usage
Render a complete form from a dataclass:
from dataclasses import dataclass
from pytypeinput import Field, Email, Annotated, analyze_dataclass
from pytypeinput.html import HTMLRenderer
@dataclass
class ContactForm:
name: str
email: Email
age: Annotated[int, Field(ge=18, le=120)]
params = analyze_dataclass(ContactForm)
renderer = HTMLRenderer()
# Render individual fields
html_fields = '\n'.join(renderer.render_param(p) for p in params)
# Get complete HTML with styles and validation
complete_html = f"""
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{renderer.get_styles()}
</head>
<body>
{html_fields}
{renderer.get_validation_script()}
</body>
</html>
"""
HTML Renderer Demo:
Render Individual Parameters
Render parameters one at a time:
from dataclasses import dataclass
from pytypeinput import analyze_dataclass
from pytypeinput.html import HTMLRenderer
@dataclass
class UserForm:
username: str
age: int
params = analyze_dataclass(UserForm)
renderer = HTMLRenderer()
# Render each parameter separately
for param in params:
html = renderer.render_param(param)
print(f"Field '{param.name}':")
print(html)
HTML Renderer Demo:
Complete Example
Full working example with all features:
from dataclasses import dataclass
from pytypeinput import (
Field, Email, Annotated, Label, Description,
Placeholder, PatternMessage, analyze_dataclass
)
from pytypeinput.html import HTMLRenderer
@dataclass
class RegistrationForm:
username: Annotated[
str,
Field(min_length=3, max_length=20, pattern=r'^[a-zA-Z0-9_]+$'),
Label("Username"),
Description("Choose a unique username"),
Placeholder("Enter username"),
PatternMessage("Only letters, numbers, and underscores")
]
email: Annotated[
Email,
Label("Email Address"),
Placeholder("you@example.com")
]
age: Annotated[
int,
Field(ge=18, le=120),
Label("Age"),
Description("You must be 18 or older")
]
newsletter: Annotated[
bool,
Label("Subscribe to Newsletter"),
Description("Receive updates and promotions")
] = True
params = analyze_dataclass(RegistrationForm)
renderer = HTMLRenderer()
fields_html = '\n'.join(renderer.render_param(p) for p in params)
html = f"""<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Registration Form</title>
{renderer.get_styles()}
</head>
<body style="padding: 20px; max-width: 600px; margin: 0 auto;">
<h1>Create Account</h1>
{fields_html}
{renderer.get_validation_script()}
</body>
</html>"""
# Save to file
with open('registration.html', 'w', encoding='utf-8') as f:
f.write(html)
HTML Renderer Demo:
Advanced Options
The renderer supports additional customization options not shown in the demos above:
# Custom CSS styles
renderer = HTMLRenderer(custom_styles="your-custom-css")
# Disable client-side validation
renderer = HTMLRenderer(enable_validation=False)
# List available CSS variables for theming
variables = HTMLRenderer.list_css_variables()
# ['--pytypeinput-border-radius', '--pytypeinput-input-bg', ...]
# Get default styles for modification
default_styles = HTMLRenderer.get_default_styles()