afs*_*hin 10 django django-forms django-views
我有一个在Django中创建动态表单的简单要求 - 我已经看过很多例子,但它们似乎不完整,或者需要比我更广泛的Python和Django知识!没有显示应该如何调用示例的动态部分:
这是Q1和Q2的表单类 - 我在表单上放置一个按钮来添加另一个名为Q3的字段 - 然后再次按下Q4:我认为我的init函数半正确:
class testform(forms.Form):
Q1 = forms.CharField()
Q2 = forms.CharField()
def __init__(self, *args, **kwargs):
super(testform,self).__init__(*args,**kwargs)
self.fields['Q%s'%i] = forms.CharField(label='Q%i' % i)
Run Code Online (Sandbox Code Playgroud)
我想在表单上放置一个按钮以添加另一个名为Q3的字段,然后再次按下Q4.
回答你的问题:每当你初始化表单时,它都会调用init().例如:form = testform().这会初始化您的表单.我在这里要做的是添加一些javascript来创建这些新字段.我不确定你对javascript有多熟悉,但我会假设你可以自己解决这个问题.
至于验证,可以在表单中完成.首先,你要告诉它你已经添加了更多的字段init().
class TestCharField(forms.CharField):
def __init__(self, *args, **kwargs):
super(TestCharField, self).__init__(*args, **kwargs) # Needs * and **
def clean(self, value):
super(TestCharField, self).clean(value)
# Do custom validation in here
return value
class testform(forms.Form):
def __init__(self, *args, **kwargs):
super(testform, self).__init__(args, kwargs)
# args should be a list with the single QueryDict (GET or POST dict)
# that you passed it
for k,v in args[0].items():
if k.startswith('Q') and k not in self.fields.keys():
self.fields[k] = TestCharField(initial=v, required=True)
Run Code Online (Sandbox Code Playgroud)
你可以随意命名你的字段,它不一定是TestCharField.只需确保在两个地方重命名.这将允许您根据需要创建任意数量的字段.如果这对您不起作用,请告诉我.
| 归档时间: |
|
| 查看次数: |
11730 次 |
| 最近记录: |