我正在制作一个webapp,这个webapp需要一个表单向导。该向导由3个ModelForms组成,它可以完美运行。但我需要第二种形式是“编辑形式”。也就是说,我需要它是一个传递实例的表单。
如何使用表单向导执行此操作?你如何传递模型的实例?我看到FormWizard类有一个get_form方法,但是有没有一种记录的方法来使用formwizard来编辑/查看数据?
答案 0 :(得分:4)
在Django 1.4中,您可以执行以下操作:
def edit(request):
initial = {
0: {'subject': 'Hello', 'sender': 'user@example.com'},
1: {'message': 'Hi there!'}
}
wiz = FormWizard([form1,form2,form3],initial_dict = initial)
return wiz(request)
答案 1 :(得分:0)
你可以在视图中使用formwizard类并在那里传递初始值,例如:
def edit(request):
initial = {0: {'field1':'value1'}}
return FormWizard([form, some_other_form], initial=initial)
其中,initial应该是一个dict,其键等于step,而value是数据的序列,就像通常的形式一样。
答案 2 :(得分:0)
我认为有一些方法,取决于您必须传递的数据有多复杂。
您可以按照此处的说明操作:https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/#providing-initial-data-for-the-forms 并创建一个初始字典,您传递给urls.py中的视图,如下所示:
>>> initial = {
... '0': {'subject': 'Hello', 'sender': 'user@example.com'},
... '1': {'message': 'Hi there!'}
... }
>>> wiz = ContactWizard.as_view([ContactForm1, ContactForm2], initial_dict=initial)
你的另一个选择,这是更复杂的,但是允许你有更多的逻辑,是覆盖get_initkwargs并将逻辑放在那里(参见Django代码:https://github.com/django/django/blob/master/django/contrib/formtools/wizard/views.py)。
最后,如果你需要根据前一个表单的输入提供对象,那么它会变得非常复杂,因为get_initkwargs是一个类方法,并且在启动向导时需要传递初始字典。但是,您可以通过覆盖get_form_kwargs来实现:
def get_form_kwargs(self, step=None):
kwargs = {}
if step != '0':
your_field = self.get_cleaned_data_for_step('0')['your_field']
# logic for getting object based on field goes here
kwargs.update({'object': object,})
return kwargs
然后,您可以使用表单的 init 方法根据您在kwargs中传递的对象设置初始值。我经常使用最后一段代码,但没有真正使用过早期代码。