2010-02-21 144 views
0

我希望我的表单是动态的,一些参数sucj as max_length for IntegerField因型号而异。通过使用来自here的信息,我写了这个形式:Django,验证表单

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的如果form.is_valid(request.POST) ()

回答

4

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

不是传递的初始值到一个工厂函数返回一个类的那些预先定义的,离开了表单定义的初始参数,和形式实例化期间将其传入:

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

非常感谢丹尼尔!我刚刚从你那里了解到这一点!我刚刚更新了我的问题来添加IntegerField。如果您还包含金额的max_value示例,我将会很有帮助。 谢谢! – Hellnar 2010-02-21 20:21:33

+0

看我上面的编辑。 – 2010-02-21 20:35:52

+0

谢谢丹尼尔!你的帮助对我来说非常重要:) – Hellnar 2010-02-21 20:48:52