Validator class changes the color of form elements to error or success based on input’s validation rules.
Base Validator
Exported source
validator = SingleValueFactory("validator", "Base validator component for input, select, textarea") # Base validator componentvalidator_hint = SingleValueFactory("validator-hint", "Base validator hint part for the hint text that appears after the input if it's invalid") # validator_hint component
Test password requirement validator from daisyUI v5 documentation.
Exported source
def test_validator_password_fasthtml_examples():"""Test password requirement validator from daisyUI v5 documentation."""from fasthtml.common import Input, P, Br, Divfrom cjm_fasthtml_daisyui.components.data_input.text_input import text_input# Password requirement validator password_validator = Div( Input(type="password", required=True, placeholder="Password", minlength="8", pattern="(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,}", title="Must be more than 8 characters, including number, lowercase letter, uppercase letter", cls=combine_classes(text_input, validator) ), P("Must be more than 8 characters, including", Br(),"At least one number", Br(),"At least one lowercase letter", Br(),"At least one uppercase letter", cls=str(validator_hint) ) )# Verify structure container = password_validatorassert container.tag =="div"assertlen(container.children) ==2# Verify password input password_input = container.children[0]assert password_input.tag =="input"assert password_input.attrs['type'] =="password"assert password_input.attrs['required'] ==Trueassert password_input.attrs['placeholder'] =="Password"assert password_input.attrs['minlength'] =="8"assert password_input.attrs['pattern'] =="(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,}"assert password_input.attrs['title'] =="Must be more than 8 characters, including number, lowercase letter, uppercase letter"assert"input"in password_input.attrs['class']assert"validator"in password_input.attrs['class']# Verify hint hint = container.children[1]assert hint.tag =="p"assert hint.attrs['class'] =="validator-hint"assert hint.children[0] =="Must be more than 8 characters, including"assert hint.children[1].tag =="br"assert hint.children[2] =="At least one number"assert hint.children[3].tag =="br"assert hint.children[4] =="At least one lowercase letter"assert hint.children[5].tag =="br"assert hint.children[6] =="At least one uppercase letter"return password_validator# Run the teststest_validator_password_fasthtml_examples()
<div><input type="password" required placeholder="Password" minlength="8" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}" class="input validator" title="Must be more than 8 characters, including number, lowercase letter, uppercase letter"><p class="validator-hint">Must be more than 8 characters, including<br>At least one number<br>At least one lowercase letter<br>At least one uppercase letter </p></div>
Test URL, date, and number requirement validators from daisyUI v5 documentation.
Exported source
def test_validator_url_date_number_fasthtml_examples():"""Test URL, date, and number requirement validators from daisyUI v5 documentation."""from fasthtml.common import Input, P, Divfrom cjm_fasthtml_daisyui.components.data_input.text_input import text_input# URL input requirement validator url_validator = Div( Input(type="url", required=True, placeholder="https://", value="https://", pattern="^(https?://)?([a-zA-Z0-9]([a-zA-Z0-9-].*[a-zA-Z0-9])?.)+[a-zA-Z].*", title="Must be valid URL", cls=combine_classes(text_input, validator) ), P("Must be valid URL", cls=str(validator_hint) ) )# Date input requirement validator date_validator = Div( Input(type="date", required=True, placeholder="Pick a date in 2025",min="2025-01-01",max="2025-12-31", title="Must be valid URL", cls=combine_classes(text_input, validator) ), P("Must be 2025", cls=str(validator_hint) ) )# Number input requirement validator number_validator = Div( Input(type="number", required=True, placeholder="Type a number between 1 to 10",min="1",max="10", title="Must be between be 1 to 10", cls=combine_classes(text_input, validator) ), P("Must be between be 1 to 10", cls=str(validator_hint) ) )# Verify URL validatorassert url_validator.tag =="div"assertlen(url_validator.children) ==2 url_input = url_validator.children[0]assert url_input.tag =="input"assert url_input.attrs['type'] =="url"assert url_input.attrs['required'] ==Trueassert url_input.attrs['placeholder'] =="https://"assert url_input.attrs['value'] =="https://"assert url_input.attrs['pattern'] =="^(https?://)?([a-zA-Z0-9]([a-zA-Z0-9-].*[a-zA-Z0-9])?.)+[a-zA-Z].*"assert url_input.attrs['title'] =="Must be valid URL"assert"input"in url_input.attrs['class']assert"validator"in url_input.attrs['class'] url_hint = url_validator.children[1]assert url_hint.tag =="p"assert url_hint.attrs['class'] =="validator-hint"assert url_hint.children[0] =="Must be valid URL"# Verify Date validatorassert date_validator.tag =="div"assertlen(date_validator.children) ==2 date_input = date_validator.children[0]assert date_input.tag =="input"assert date_input.attrs['type'] =="date"assert date_input.attrs['required'] ==Trueassert date_input.attrs['placeholder'] =="Pick a date in 2025"assert date_input.attrs['min'] =="2025-01-01"assert date_input.attrs['max'] =="2025-12-31"assert date_input.attrs['title'] =="Must be valid URL"assert"input"in date_input.attrs['class']assert"validator"in date_input.attrs['class'] date_hint = date_validator.children[1]assert date_hint.tag =="p"assert date_hint.attrs['class'] =="validator-hint"assert date_hint.children[0] =="Must be 2025"# Verify Number validatorassert number_validator.tag =="div"assertlen(number_validator.children) ==2 number_input = number_validator.children[0]assert number_input.tag =="input"assert number_input.attrs['type'] =="number"assert number_input.attrs['required'] ==Trueassert number_input.attrs['placeholder'] =="Type a number between 1 to 10"assert number_input.attrs['min'] =="1"assert number_input.attrs['max'] =="10"assert number_input.attrs['title'] =="Must be between be 1 to 10"assert"input"in number_input.attrs['class']assert"validator"in number_input.attrs['class'] number_hint = number_validator.children[1]assert number_hint.tag =="p"assert number_hint.attrs['class'] =="validator-hint"assert number_hint.children[0] =="Must be between be 1 to 10"return Div(url_validator, date_validator, number_validator)# Run the teststest_validator_url_date_number_fasthtml_examples()
<div><div><input type="url" required placeholder="https://" value="https://" pattern="^(https?://)?([a-zA-Z0-9]([a-zA-Z0-9-].*[a-zA-Z0-9])?.)+[a-zA-Z].*" class="input validator" title="Must be valid URL"><p class="validator-hint">Must be valid URL</p></div><div><input type="date" required placeholder="Pick a date in 2025" min="2025-01-01" max="2025-12-31" class="input validator" title="Must be valid URL"><p class="validator-hint">Must be 2025</p></div><div><input type="number" required placeholder="Type a number between 1 to 10" min="1" max="10" class="input validator" title="Must be between be 1 to 10"><p class="validator-hint">Must be between be 1 to 10</p></div></div>