Django中的编辑表单向导
我正在制作一个网页应用,这个应用需要有一个表单向导。这个向导包含了三个模型表单,运行得非常顺利。不过,我需要第二个表单是一个“编辑表单”。也就是说,我需要这个表单能够接收一个实例。
那么,如何在表单向导中做到这一点呢?怎样才能传入一个模型的实例呢?我看到FormWizard类有一个get_form方法,但有没有什么文档说明可以用表单向导来编辑或查看数据呢?
3 个回答
我觉得有几种方法可以选择,这取决于你需要传递的数据有多复杂。
你可以按照这里的说明来做: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中传递的对象来设置初始值。我经常使用最后一段代码,但之前的那些我就没怎么用过。
你可以在视图中使用formwizard类,并在里面传递初始值,像这样:
def edit(request):
initial = {0: {'field1':'value1'}}
return FormWizard([form, some_other_form], initial=initial)
这里的初始值应该是一个字典,字典的键对应每一步的名称,值则是包含数据的字典,就像普通表单那样。
在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)