Django,验证表单

Posted

技术标签:

【中文标题】Django,验证表单【英文标题】:Django, validating Form 【发布时间】:2011-01-19 10:09:10 【问题描述】:

我希望我的表单是动态的,一些参数如 IntegerField 的 max_length 因模型而异。通过使用来自here 的信息,我写了这个表格:

def my_form(inputname, inputlastname, inputamount):
 class MyForm(forms.Form):
  name = forms.CharField(max_length=50,required=True,initial=inputname)
  lastname = forms.CharField(max_length=50, required=True,initial=inputlastname)
  amount= forms.IntegerField(max_value=inputamount, required=True)
 return MyForm

当我这样调用它并传递给模板时,它在模板上渲染得很好:

form = my_form("David","Bowie",4)()

但是我不知道如何验证它,这失败了:

如果 request.method == 'POST': 表单 = MyForm(request.POST) 如果 form.is_valid()

【问题讨论】:

【参考方案1】:

没有理由这样做。你让事情变得不必要地复杂了。

不要将初始值传递给工厂函数,该函数返回具有预定义的类,而是在表单定义中省略初始参数,并在表单实例化期间传递它们:

class MyForm(forms.Form):
    name = forms.CharField(max_length=50,required=True)
    lastname = forms.CharField(max_length=50, required=True)

...

form = MyForm(request.POST, initial='firstname':myfirstname, 'surname':mysurname)

附加问题后编辑

为了有一个动态的max_value 用于金额,您可以覆盖表单的__init__ 方法并将其设置在那里。然后再一次在实例化时传递值。

class MyForm(forms.Form):
    name = forms.CharField(max_length=50,required=True)
    lastname = forms.CharField(max_length=50, required=True)
    amount = forms.IntegerField(required=True)

    def __init__(self, *args, **kwargs):
        amount_max = kwargs.pop('amount_max', None)
        super(MyForm, self).__init__(*args, **kwargs)
        if amount_max:
            self.fields['amount'].max_value = amount_max

...

form = MyForm(request.POST, amount_max=10,
              initial='firstname':myfirstname, 'surname':mysurname)

【讨论】:

非常感谢丹尼尔!我刚从你那里学到这个!我刚刚更新了我的问题以添加 IntegerField。如果您还包括金额的 max_value 示例,我将不胜感激。谢谢! 哇,谢谢丹尼尔!你在这方面的帮助对我来说真的很重要:)

以上是关于Django,验证表单的主要内容,如果未能解决你的问题,请参考以下文章

17.Django表单验证

Django 表单验证与 DRF 序列化程序验证

Django 表单验证

在 Django 中分离表单输入和模型验证?

不使用 django 表单如何验证和保存表单数据

Django 和自定义表单验证