Django Forms - Как использовать префиксный параметр - PullRequest
18 голосов
/ 22 октября 2008

Скажите, что у меня есть такая форма:

class GeneralForm(forms.Form):
    field1 = forms.IntegerField(required=False)
    field2 = forms. IntegerField(required=False)

И я хочу показать его дважды на странице в пределах одного тега формы каждый раз с другим префиксом, например:

rest of page ...
<form ..>
GeneralForm(data,prefix="form1").as_table()
GeneralForm(data,prefix="form2").as_table()
<input type="submit" />
</form>
rest of page ...

Когда пользователь отправляет это, как я могу вернуть отправленную форму в две отдельные формы для проверки и перезапустить ее?

Это была единственная документация Я смог ее найти, и она дерзкая.

Ответы [ 2 ]

31 голосов
/ 22 октября 2008

Вы обрабатываете каждую форму как обычно, гарантируя, что вы создаете экземпляры, которые имеют те же префиксы, что и те, которые использовались для первоначального создания формы.

Вот немного неуклюжий пример использования формы, которую вы дали, так как я не знаю точный вариант использования:

def some_view(request):
    if request.method == 'POST':
        form1 = GeneralForm(request.POST, prefix='form1')
        form2 = GeneralForm(request.POST, prefix='form2')
        if all([form1.is_valid(), form2.is_valid()]):
            pass # Do stuff with the forms
    else:
        form1 = GeneralForm(prefix='form1')
        form2 = GeneralForm(prefix='form2')
    return render_to_response('some_template.html', {
        'form1': form1,
        'form2': form2,
    })

Вот пример реального кода, который демонстрирует обработку форм с использованием префикса:

http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/

6 голосов
/ 10 ноября 2008

Еще лучше, я думаю formsets это именно то, что вы ищете.

class GeneralForm(forms.Form):
    field1 = forms.IntegerField(required=False)
    field2 = forms. IntegerField(required=False)

from django.forms.formsets import formset_factory

# GeneralSet is a formset with 2 occurrences of GeneralForm 
# ( as a formset allows the user to add new items, this enforces
#   2 fixed items, no less, no more )
GeneralSet = formset_factory(GeneralForm, extra=2, max_num=2)

# example view

def someview(request):
    general_set = GeneralSet(request.POST)
    if general_set.is_valid():
        for form in general_set.forms:
            # do something with data
    return render_to_response("template.html", {'form': general_set}, RequestContext(request))

Вы можете даже автоматически сформировать набор форм из модели с modelformset_factory , которые используются автоматическим администратором django. FormSet обрабатывает даже больше вещей, чем простые формы, такие как добавление, удаление и сортировка элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...