Hel*_*nar 0 django django-forms
我希望我的表单是动态的,一些参数如 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
Run Code Online (Sandbox Code Playgroud)
当我这样调用它并传递给模板时,它在模板上呈现得很好:
form = my_form("David","Bowie",4)()
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何验证它,这失败了:
if request.method == 'POST': form = MyForm(request.POST) if form.is_valid()
没有理由这样做。你让事情变得不必要地复杂。
与其将初始值传递给一个工厂函数,该函数返回一个具有这些预定义类的类,而是在表单定义中省略初始参数,并在表单实例化期间将它们传入:
class MyForm(forms.Form):
name = forms.CharField(max_length=50,required=True)
lastname = forms.CharField(max_length=50, required=True)
Run Code Online (Sandbox Code Playgroud)
...
form = MyForm(request.POST, initial={'firstname':myfirstname, 'surname':mysurname})
Run Code Online (Sandbox Code Playgroud)
补充问题后编辑
为了有一个动态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
Run Code Online (Sandbox Code Playgroud)
...
form = MyForm(request.POST, amount_max=10,
initial={'firstname':myfirstname, 'surname':mysurname})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
508 次 |
| 最近记录: |