【问题标题】:Django DRY functions in forms表单中的 Django DRY 函数
【发布时间】:2018-12-16 08:26:06
【问题描述】:

在我的 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

是不是因为表单是类,而不是定义?

【问题讨论】:

  • 试着把它放在被引用的表单类之上
  • @Umair 如果我把它放在def my_func(): my_var = something return my_var 中,然后在表单类中调用 my_func() 它不包括函数的输出

标签: python django django-forms django-rest-framework


【解决方案1】:

如果您想在您的电子邮件字段中包含额外的验证,那么您可以写一个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)

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

【讨论】:

  • @Raif 试图弄清楚如何根据django-rest-framework.org/api-guide/validators 格式化validators = [ ]
  • required= False, initial=True, label =
  • @HashRocketSyntax 我不明白你想要什么。您是否还需要在所有字段中包含requiredinitiallabel?我编辑了我的问题以包含它。
  • 谢谢你!我认为这篇文章对社区来说真的很有价值。 148 deletions(-)
猜你喜欢
  • 2015-03-13
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 2014-05-04
  • 1970-01-01
  • 2012-05-08
相关资源
最近更新 更多