django: Как использовать inlineformset в мастере форм? - PullRequest
4 голосов
/ 15 июня 2011

Я показываю два отдельных примера проектов.Первый связан с Контактом и показывает принцип использования мастера форм.Второй - проект, связанный с ингредиентами для рецептов, который показывает, как использовать встроенные элементы в форме.Я хочу, чтобы in-line были в моем помощнике форм так же, как они работают в обычной форме.

У меня работает многошаговая форма formwizard.Он основан на примере здесь .Я немного изменил его, чтобы использовать modelform.

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>

Как я могу настроить inline для работы в моей многошаговой форме 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)

1 Ответ

3 голосов
/ 16 июня 2011

Мастер форм, включенный в Django (ниже версии 1.4), не поддерживает наборы форм.Начиная с версии 1.4, будет намного лучшая реализация (см. https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/)

. Возвращаясь к вашему вопросу, если вы не можете дождаться следующего релиза Django, который, как я предполагаю, вы можете придерживаться django-Formwizard. Последний выпуск (1.0) API совместим с грядущим форм-мастером Django.

С новой реализацией FormWizard вы можете использовать FormSets так же, как и обычные формы.

...