django:如何在表单向导中使用 inlineformset?
Posted
技术标签:
【中文标题】django:如何在表单向导中使用 inlineformset?【英文标题】:django: How to use inlineformset within the formwizard? 【发布时间】:2011-09-15 18:02:16 【问题描述】:我正在展示两个单独的示例项目。第一个是与联系人相关的,并显示了使用表单向导的原理。第二个是食谱相关项目的成分,它展示了如何在表单中使用内联。我希望内联在我的表单向导中与它们在正常表单中的工作方式相同。
我有一个表单向导多步表单正在工作。它基于example here。我已经稍微改变了它以使用模型形式。
models.py
from django.db import models
# Create your models here.
class Contact(models.Model):
subject = models.CharField(max_length=50)
sender = models.EmailField()
def __unicode__(self):
return self.subject
class Contact2(models.Model):
message = models.TextField(max_length=500)
def __unicode__(self):
return self.message
forms.py
class ContactForm1(forms.ModelForm):
class Meta:
model = Contact
class ContactForm2(forms.ModelForm):
class Meta:
model = Contact2
class ContactWizard(FormWizard):
@property
def __name__(self):
return self.__class__.__name__
def done(self, request, form_list):
# do_something_with_the_form_data(form_list)
return HttpResponseRedirect('/done/')
urls.py
(r'^contact/$', ContactWizard([ContactForm1, ContactForm2])),
另外,我将内联生成为另一种形式。在我看来,我是通过 inlineformset_factory 来实现的。 这与上面的表单向导示例无关。这是一个配方示例的成分。 我正在这样做:
views.py
def add(request):
IngredientFormSet = inlineformset_factory(Recipe, Ingredient,
fk_name="recipe",
formfield_callback=curry(ingredient_form_callback, None))
if request.method == 'POST':
form = RecipeForm(request.POST)
formset = IngredientFormSet(request.POST)
if form.is_valid() and formset.is_valid():
recipe = form.save()
formset = IngredientFormSet(request.POST, instance=recipe)
formset.save()
return redirect("/edit/%s" % recipe.id)
else:
form = RecipeForm()
formset = IngredientFormSet()
return render_to_response("recipes_add.html", "form":form, "formsets":formset, context_instance=RequestContext(request))
recipes_add.html
<form method="post">
% csrf_token %
<table>
form
</table>
<hr>
<h3>Ingredients</h3>
<div class="inline-group">
<div class="tabular inline-related last-related">
formsets.management_form
% for formset in formsets.forms %
<table>
formset
</table>
% endfor %
</div>
</div>
<p class="success tools"><a href="#" class="add">Add another row</a></p>
<input type="submit" value="Add">
</form>
如何让内联在我的表单向导多步表单中工作? models.py 现在看起来像这样,因为我希望书籍可以内联。我希望内联出现在我的表单向导的第一步。然后进入第 2 步并完成。
from django.db import models
# Create your models here.
class Contact(models.Model):
subject = models.CharField(max_length=50)
sender = models.EmailField()
def __unicode__(self):
return self.subject
class Contact2(models.Model):
message = models.TextField(max_length=500)
def __unicode__(self):
return self.message
class Book(models.Model):
author = models.ForeignKey(Contact)
title = models.CharField(max_length=100)
【问题讨论】:
【参考方案1】:Django 中包含的表单向导(低于 1.4 版)不支持表单集。从 1.4 版开始,会有更好的实现(参见https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/)
回到你的问题,如果你等不及下一个 Django 版本——我假设——你可以坚持使用 django-formwizard。最后一个版本 (1.0) 与即将推出的 Django formwizard 兼容。
通过新的表单向导实现,您可以像使用普通表单一样使用表单集。
【讨论】:
以上是关于django:如何在表单向导中使用 inlineformset?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用默认文件存储(S3)通过 Django FormTools 表单向导上传文件?