【问题标题】:Django, validating FormDjango,验证表单
【发布时间】: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()

【问题讨论】:

    标签: django django-forms


    【解决方案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 示例,我将不胜感激。谢谢!
    • 哇,谢谢丹尼尔!你在这方面的帮助对我来说真的很重要:)
    猜你喜欢
    • 2011-03-10
    • 2021-06-05
    • 2014-12-06
    • 2017-08-24
    • 2019-02-02
    • 2020-06-10
    • 2011-01-20
    • 2021-06-19
    相关资源
    最近更新 更多