Django Forms - Como usar o prefixo de parâmetro

votos
18

Digamos que eu tenha um formulário como:

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

E eu quero mostrá-lo duas vezes em uma página dentro de uma tag forma cada vez com um prefixo diferente, por exemplo ,:

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

Quando o usuário submete isso, como faço para obter o formulário enviado de volta em duas formas diferentes para fazer a validação, e exibi-la novamente?

Esta foi a única documentação que eu poderia encontrar e é com fome.

Publicado 22/10/2008 em 17:10
fonte usuário
Em outras línguas...                            


2 respostas

votos
31

Você processar cada forma como faria normalmente, garantindo que você criar instâncias que têm os mesmos prefixos como aqueles usados ​​para gerar a forma inicialmente.

Aqui está um exemplo um pouco estranho, utilizando o formulário que você deu, como eu não sei o que o caso de uso exata é:

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,
    })

Aqui está um código de exemplo do mundo real que demonstra formas de processamento usando o prefixo:

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

Respondeu 22/10/2008 em 17:27
fonte usuário

votos
5

Mesmo melhor, eu acho formsets é exatamente o que você está procurando.

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

Você pode até ter um formset gerado automaticamente a partir de um modelo com modelformset_factory , que são utilizados pela administração do Django automatizado. FormSet lidar com mais coisas do que as formas simples, como adicionar, remover e classificar itens.

Respondeu 10/11/2008 em 00:53
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more