4

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)
4

1 に答える 1

3

Django (バージョン 1.4 以前) に含まれるフォームウィザードは、フォームセットをサポートしていません。バージョン 1.4 から、実装が大幅に改善されます ( https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/を参照) 。

質問に戻りますが、次の Django のリリースが待ちきれない場合は (私はそう思います)、django-formwizard に固執することができます。最後のリリース (1.0) は、今後の Django フォームウィザードと互換性のある API です。

新しいフォームウィザードの実装により、通常のフォームを使用するのと同じ方法でフォームセットを使用できます。

于 2011-06-16T08:54:45.780 に答える