制作Django forms.py DRY的好习惯

时间:2014-05-26 11:19:05

标签: python django django-forms

我知道如何让我的forms.py干,但因为我以前从未见过它,所以我在质疑自己。

目的是以不同的形式重复使用表单字段。

以下是我想做的事情:

档案:form_fields.py

EMAIL_FIELD = forms.EmailField(
    label="Adresse e-mail",
    widget=forms.TextInput(),
    error_messages=DICT_ERROR)

PASSWORD_FIELD = ...

档案:forms.py

class SignupForm(forms.Form):
    email = EMAIL_FIELD
    pwd = PASSWORD_FIELD
    ... etc.

class SigninForm(forms.Form):
    email = EMAIL_FIELD
    pwd = PASSWORD_FIELD

你可以吗?如果不是,你有什么建议建立一个forms.py文件的好“架构”,在我的案例中可以增长很多?

另外,我问自己是否应该为具有相同特征的字段(例如名字和姓氏)仅创建1个字段变量。在这种情况下,你如何处理不同的标签?

感谢。

2 个答案:

答案 0 :(得分:2)

这是你可以做到的一种方式。

class BaseForm(forms.Form):
    email = forms.EmailField()
    password = forms.CharField()

    class Meta:
        abstract=True

##Inherit BaseForm
class SignUpForm(BaseForm):
    ## Other attributes

答案 1 :(得分:2)

user2032220的回答很好。而不是使用EMAIL_FIELD,最好扩展forms.EmailField类并为类应用您自己的默认值:

class EmailField(forms.EmailField):
    """Your custom EmailField with best set of default kwargs"""
    def __init__(self, *args, **kwargs):
        kwargs.setdefault('label', 'Adresse e-mail')
        kwargs.setdefault('widget', forms.TextInput())
        kwargs.setdefault('error_messages', DICT_ERROR)
        return super(EmailField, self).__init__(*args, **kwargs)


class BaseForm(forms.Form):
    email = EmailField()
    password = forms.CharField()

    class Meta:
        abstract=True

##Inherit BaseForm
class SignUpForm(BaseForm):
    ## Other attributes

class ContactForm(forms.Form):
    # Easy way of changing just one parameter
    email = EmailField(label='Your email')