Skip to main content
 首页 » 编程设计

python之表单中的 Django DRY 函数

2024年12月31日22cyq1162

在我的 forms.py 中,我必须设置并清除许多类似的变量。

class FormOne(forms.Form): 
    email_field = forms.EmailField( 
        required=True, 
        max_length=70, 
        label=mark_safe("""<i>Enter email address</i>""")) 
 
    # other fields 
 
    def clean_email_field(self): 
        return data 
 
class FormTwo(forms.Form): 
    email_field = forms.EmailField( 
        required=True, 
        max_length=70, 
        label=mark_safe("""<i>Enter email address</i>""")) 
 
    # other fields 
 
    def clean_email_field(self): 
        return data 

在我的 views.py 中,我可以成功地在文件底部定义一个函数并在上面的代码中引用它。但是,如果我尝试将类似这样的内容放在文件底部:

def clean_email_field(form_data): 
    # rest of function 

然后我得到错误:

***ERROR*** clean_email_field undefined 

是因为表单是类,而不是 defs 吗?

请您参考如下方法:

如果你想在你的电子邮件字段中包含额外的验证,那么你可以写一个 custom validator然后将其包含在您的 form field 中.例如:

from django import forms 
from django.core.exceptions import ValidationError 
 
def validate_contains_something(value): 
    if 'something' not in value: 
        raise ValidationError('no 'something' found') 
 
class FormTwo(forms.Form): 
    email_field = forms.EmailField( 
        required=True, 
        max_length=70, 
        label=mark_safe("""<i>Enter email address</i>"""), 
        validators=[ 
            validate_contains_something, 
        ]) 

您甚至可以将自定义验证器作为默认值来编写自定义字段(如 this example in the docs 中所示):

class CustomEmailField(forms.EmailField): 
    def __init__(self, *args, **kwargs): 
        super().__init__( 
            *args, 
            required=True, 
            max_length=70, 
            label=mark_safe("""<i>Enter email address</i>"""), 
            validators=[ 
                validate_contains_something, 
            ], 
            **kwargs) 
 
class CustomEmailField2(forms.EmailField): 
    def __init__(self, *args, **kwargs): 
        kwargs.setdefault('required', True) 
        kwargs.setdefault('max_length', 70) 
        kwargs.setdefault('label', mark_safe("""<i>Enter email address</i>""")) 
        kwargs.setdefault('validators', [validate_contains_something, ]) 
        super().__init__(*args, **kwargs) 

这种方法可能是一种只编写一次验证逻辑的更简单方法。