Django,验证表单

28 浏览
0 Comments

Django,验证表单

我希望我的表单是动态的,一些参数(如IntegerField的max_length)因模型而异。根据来自这里的信息,我编写了这个表单:

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)()

然而,我无法弄清楚如何验证它,下面的代码失败了:

if request.method == 'POST':

form = MyForm(request.POST)

if form.is_valid()

0
0 Comments

Django中,验证表单时出现的问题是,用户在表单定义中使用了初始参数,但在表单实例化时未正确传递这些参数。下面是解决该问题的方法:

首先,不要在表单定义中传递初始参数,而是在表单实例化时传递这些参数。具体做法是,在表单定义中将初始参数去掉,然后在表单实例化时通过initial参数传递初始值。示例代码如下:

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})

此外,如果需要对amount字段的max_value进行动态设置,可以通过重写表单的`__init__`方法来实现。在该方法中,可以接收并设置amount_max参数,并在实例化时传递该值。示例代码如下:

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})

通过以上方法,可以解决在Django中验证表单时出现的问题,并实现对表单字段的动态设置。

0