2 つの個別のサンプル プロジェクトを表示しています。1 つ目は連絡先関連で、フォーム ウィザードを使用する原則を示しています。2 つ目は、フォーム内でインラインを使用する方法を示すレシピ関連プロジェクトの材料です。通常のフォームで機能するのと同じように、インラインをフォームウィザードに入れたいです。
formwizard マルチステップフォームが機能しています。これは、こちらの例に基づいています。モデルフォームを使用するように少し変更しました。
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
フォーム.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を介してこれを行っています。これは、上記のフォームウィザードの例とは関係ありません。具材のレシピ例です。私はこれを次のようにやっています:
ビュー.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))
レシピ_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>
formwizard マルチステップ フォーム内でインラインを機能させるにはどうすればよいですか? ブックをインラインで連絡先にしたいので 、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)