Sie sind auf Seite 1von 16

2/23/2016

Criando formulrios a partir de models Django 1.0 documentation

Criandoformulriosapartirdemodels
ModelForm
Sevocestconstruindoumaaplicaobaseadaembancodedados,existeumagrande
chancedequeseusformulrioscorresponderocomosseusmodelosDjango.Porexemplo,
voctemummodeloBlogComment,equercriarumformulrioquepossibilitequeas
pessoasenviemcomentrios.Nestecaso,seriaredundantedefinirostiposdecamponoseu
formulrio,porqueissojfoifeitonoseumodelo.
Porestemotivo,oDjangodisponibilizaumaclassedeajudaquepossibilitaacriaodeuma
classeFormapartirdeummodeloDjango.
Porexemplo:
>>> from django.forms import ModelForm
# Cria a classe de formulrio
>>> class ArticleForm(ModelForm):
...
class Meta:
...
model = Article
# Criando um formulrio para adicionar um artigo.
>>> form = ArticleForm()
# Criando um formulrio para atualizar dados de um artigo.
>>> article = Article.objects.get(pk=1)
>>> form = ArticleForm(instance=article)

Tiposdecampos
AclasseFormgeradaterumcampodeformulrioparacadacampodemodelo.Cada
campodemodelotemumcampodeformulriocorrespondentepadro.Porexemplo,um
CharFieldnummodelorepresentadocomoumCharFieldnumformulrio.Um
ManyToManyFieldnomodelorepresentadocomoumMultipleChoiceField.Segue
umalistacompletadeconverses:
Campodemodelo

Campodeformulrio

AutoField

Norepresentadonoformulrio

BooleanField

BooleanField

CharField

CharFieldcommax_lengthigualaovalorde

https://django-portuguese.readthedocs.org/en/1.0/topics/forms/modelforms.html

1/16

2/23/2016

Criando formulrios a partir de models Django 1.0 documentation

max_lengthdocampodomodelo
CommaSeparatedIntegerField

CharField

DateField

DateField

DateTimeField

DateTimeField

DecimalField

DecimalField

EmailField

EmailField

FileField

FileField

FilePathField

CharField

FloatField

FloatField

ForeignKey

ModelChoiceField(vejaabaixo)

ImageField

ImageField

IntegerField

IntegerField

IPAddressField

IPAddressField

ManyToManyField

ModelMultipleChoiceField(vejaabaixo)

NullBooleanField

CharField

PhoneNumberField

USPhoneNumberField(de
django.contrib.localflavor.us)

PositiveIntegerField

IntegerField

PositiveSmallIntegerField

IntegerField

SlugField

CharField

SmallIntegerField

IntegerField

TextField

CharFieldcomwidget=forms.Textarea

TimeField

TimeField

URLField

URLFieldcomverify_existsigualaovalorde
verify_existsdocampodomodelo

XMLField

CharFieldcomwidget=Textarea

NewinDjango1.0:OcampodeformulrioFloatFieldjuntamentecomoscamposde
fomulrioedemodeloDecimalFieldsonovosnoDjango1.0.
Comoesperado,oscamposdemodelodotipoForeignKeyeManyToManyFieldso
casosespeciais:
ForeignKeyrepresentadopordjango.forms.ModelChoiceField,queum
ChoiceFieldemquechoicesumQuerySetdomodelo.
ManyToManyFieldrepresentadopor
django.forms.ModelMultipleChoiceField,queumMultipleChoiceField

emquechoicesumQuerySetdomodelo.
https://django-portuguese.readthedocs.org/en/1.0/topics/forms/modelforms.html

2/16

2/23/2016

Criando formulrios a partir de models Django 1.0 documentation

Almdisso,cadacampodeformulriogeradotemosvaloresdeatributosdefinidoscomo
asseguir:
Seumcampodemodelotemblank=True,entoovalorderequiredserFalseno
campodeformulrio.Casocontrrio,required=True.
Oatributolabeldocampodeformulrioserigualaoverbose_namedocampode
modelo,comoprimeirocaractereemmaisculo.
Ohelp_textdocampodeformulrioigualaohelp_textdocampodemodelo.
Seocampodemodelotemoatributochoicesdefinido,entoowidgetdocampode
formulrioseroSelect,comalistadeopesvindasdoatributochoicesdocampo
demodelo.Asopesnormalmenteincluiroovalorembranco,queselecionadopor
padro.Seocamporequerido,issoforaousurioafazerumaescolha.Ovalorem
branconoserincludoseocampodemodelotematributoblank=Falseeumvalor
dedefaultexplcito(emvezdissoovalordedefaultserselecionadoinicialmente).
Finalmente,notequevocpoderedefinirocampodeformulrioutilizadoporumdeterminado
modelo.VejaRedefinindoostiposdecampopadroabaixo.

Umexemplocompleto
Considereesteconjuntodemodelos:
from django.db import models
from django.forms import ModelForm
TITLE_CHOICES = (
('MR', 'Mr.'),
('MRS', 'Mrs.'),
('MS', 'Ms.'),
)
class Author(models.Model):
name = models.CharField(max_length=100)
title = models.CharField(max_length=3, choices=TITLE_CHOICES)
birth_date = models.DateField(blank=True, null=True)
def __unicode__(self):
return self.name
class Book(models.Model):
name = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
class AuthorForm(ModelForm):
class Meta:
https://django-portuguese.readthedocs.org/en/1.0/topics/forms/modelforms.html

3/16

2/23/2016

Criando formulrios a partir de models Django 1.0 documentation

model = Author
class BookForm(ModelForm):
class Meta:
model = Book

Comestesmodelos,assubclassesdeModelFormacimaseriamequivalentesaisto(anica
diferenasendoomtodosave(),quediscutiremosdaquiapouco.):
class AuthorForm(forms.Form):
name = forms.CharField(max_length=100)
title = forms.CharField(max_length=3,
widget=forms.Select(choices=TITLE_CHOICES))
birth_date = forms.DateField(required=False)
class BookForm(forms.Form):
name = forms.CharField(max_length=100)
authors = forms.ModelMultipleChoiceField(queryset=Author.objects

Omtodosave()
TodoformulrioproduzidoporModelFormtemtambmummtodosave().Estemtodo
criaegravaumobjetonobancodedadosapartirdosdadosatreladosaoformulrio.Uma
subclassedeModelFormpodeaceitarumainstnciademodeloexistentecomouma
argumentonomeadoinstanceseesteargumentofornecido,osave()iratualizara
instncia.Senofornecido,osave()criarumanovainstnciadomodeloespecificado:
# Cria uma instncia de formulrio com dados do POST.
>>> f = ArticleForm(request.POST)
# Grava um novo objeto Article com os dados do formulrio.
>>> new_article = f.save()
# Cria um formulrio para editar um Article existente.
>>> a = Article.objects.get(pk=1)
>>> f = ArticleForm(instance=a)
>>> f.save()
# Cria um formulrio para editar um Article existente, mas
# usa os dados do POST para popular o formulrio.
>>> a = Article.objects.get(pk=1)
>>> f = ArticleForm(request.POST, instance=a)
>>> f.save()

https://django-portuguese.readthedocs.org/en/1.0/topics/forms/modelforms.html

4/16

2/23/2016

Criando formulrios a partir de models Django 1.0 documentation

Notequesave()irlevantarumaexceoValueErrorseosdadosnoformulriono
validaremousejaif form.errors.
Estemtodosave()aceitaumargumentonomeadoopcionalcommit,queaceitaouTrue
ouFalse.Sevocchamarsave()comcommit=False,entoeledevolverumobjetoque
aindanofoigravadonobancodedados.Nestecaso,suaresponsabilidadechamar
save()nainstnciademodelo.Issotilsevocquerfazeralgumcustomprocessamento

customizadonoobjetoantesdegravlo,ousevocquerusarumumasdasopesde
gravaodemodeloespecializadas.commitTrueporpadro.
Umefeitocolateralnousodecommit=Falsenotadoquandooseumodelotemum
relacionamentodemuitosparamuitoscomoutromodelo.Seseumodelotemum
relacionamentodemuitosparamuitosevocespecificacommit=Falsequandovaigravar
umformulrio,oDjangonopodegravaroddadosparaorelacionamentodemuitospara
muitosimediatamente.Issosedeveaofatodenoserpossvelgravarosdadosdemuitos
paramuitosparaumainstnciaqueaindanoexistenobancodedados.
Paracontornaresteproblema,cadavezquevocgravaumformulriousando
commit=False,oDjangoadicionaummtodosave_m2m()paraasuasubclassede
ModelForm.Depoisdedegravarmanualmenteainstnciaproduzidapeloformulrio,voc

podechamarsave_m2m()paragravarosdadosdemuitosparamuitosdoformulrio.Por
exemplo:
# Cria uma instncia de formulrio com os dados de POST.
>>> f = AuthorForm(request.POST)
# Cria, mas no grava a nova instncia de Author.
>>> new_author = f.save(commit=False)
# Modifica o Author de alguma maneira.
>>> new_author.some_field = 'some_value'
# Grava a nova instncia.
>>> new_author.save()
# Agora, grava od dados de muitos para muitos para o formulrio.
>>> f.save_m2m()

Snecessriochamarosave_m2m()sevocusarsave(commit=False).Quandovoc
simplesmenteusaosave()numformulrio,todososdadosincluindoosdadosdemuitos
paramuitossogravadossemanecessidadedechamadasanenhummtodoadicional.
Porexemplo:
https://django-portuguese.readthedocs.org/en/1.0/topics/forms/modelforms.html

5/16

2/23/2016

Criando formulrios a partir de models Django 1.0 documentation

# Cria uma instncia de formulrio com os dados de POST.


>>> a = Author()
>>> f = AuthorForm(request.POST, instance=a)
# Cria e grava a nova instncia de Author. No h necessidade de fazer
# nada mais.
>>> new_author = f.save()

Anoserpelosmtodossave()esave_m2m(),umModelFormfuncionaexatamenteigual
aqualqueroutroformulriodeforms.Porexemplo,omtodois_valid()`utilizadopara
validarosdados,omtodois_multipart()paradeterminarseumformulriorequer
uploaddearquivomultipart(eserequest.FILESdeveserpassadoaoformulrio),etc.Veja
Vinculandoarquivosenviadosaumformulrioparamaisinformao.

Usandosomentealgunscamposnoformulrio
Emalgunscasos,vocnoquerquetodososcamposdomodeloapareamnoformulrio
gerado.ExistemtrsmaneirasdedizeraoModelFormparausarsomentealgunscamposdo
modelo:
1.Coloqueeditable=Falsenocampodomodelo.Comoresultado,qualquerformulrio
criadoviaModelFormnoincluirestecampo.
2.UseoatributofieldsdaclasseinternaMetadoModelForm.Esseatributo,se
especificado,deveserumalistadenomesdecamposaseremincludosnoformulrio.
3.UseoatributoexcludedaclasseinternaMetadoModelForm.Esseatributo,se
especificado,deveserumalistadenomesdecamposaseremexcludosdoformulrio.
Porexemplo,sevocquerqueumformulrioparaomodeloAuthor(definidoacima)tenha
somenteoscamposnameetitle,vocespecificariafieldsouexcludeassim:
class PartialAuthorForm(ModelForm):
class Meta:
model = Author
fields = ('name', 'title')
class PartialAuthorForm(ModelForm):
class Meta:
model = Author
exclude = ('birth_date',)

JqueomodeloAuthortemsomentetrscampos,'name','title',e'birth_date',osformulrios
acimaconteroexatamenteosmesmoscampos.
https://django-portuguese.readthedocs.org/en/1.0/topics/forms/modelforms.html

6/16

2/23/2016

Criando formulrios a partir de models Django 1.0 documentation

Note
SevocespecificafieldsouexcludenacriaodeumformulriocomModelForm,
entonachamadadomtodosave(),noseroatribudosvaloresaoscamposque
noconstamdoformulrioresultante.ODjangoimpedirqualquertentativadegravar
ummodeloincompleto,entoseomodelonopermitequeoscamposfaltantessejam
vazios,enoexisteumvalorpadrodefinidoparaeles,qualquertentativadechamar
save()numModelFormcomcamposfaltantesnofuncionar.Paraevitaresseerro,
vocdeveinstanciarseumodelocomvaloresiniciaisparaoscamposvazios,porm
obrigatrios:
author = Author(title='Mr')
form = PartialAuthorForm(request.POST, instance=author)
form.save()

Alternatively,youcanusesave(commit=False)andmanuallysetanyextrarequired
fields:
form = PartialAuthorForm(request.POST)
author = form.save(commit=False)
author.title = 'Mr'
author.save()

Vejaaseosobregravaodeformulriosparamaisdetalhesnousode
save(commit=False).

Redefinindoostiposdecampopadro
Ostiposdecampospadro,comodescritosnatabelaTipos de camposacima,so
padressensatos.SevoctemumDateFieldnoseumodelo,existemgrandeschancesdq
quevocqueiraqueelesejarepresentadocomoumDateFieldnoseuformulrio.Maso
ModelFormtedaflexibilidadedemudarocampodeformulrioparaumdeterminado
campodemodelo.Issofeitodemaneiradeclarativaespecificandooscamposcomofaria
numFormnormal.Camposdeclaradosredefinirooscampspadresgeradospelousodo
atributomodel.
Porexemplo,sevocquiserusarMyDateFormFieldparaocampopub_date,faao
seguinte:
>>> class ArticleForm(ModelForm):
...
pub_date = MyDateFormField()
...
...
class Meta:
...
model = Article

https://django-portuguese.readthedocs.org/en/1.0/topics/forms/modelforms.html

7/16

2/23/2016

Criando formulrios a partir de models Django 1.0 documentation

Sequiserredefinerumwidgetpadrodeumcampo,entoespecifiqueoparmetrowidget
quandodeclararocampodeformulrio:
>>> class ArticleForm(ModelForm):
...
pub_date = DateField(widget=MyDateWidget())
...
...
class Meta:
...
model = Article

Sobrescrevendoomtodoclean()
Vocpodesobrescreveromtodoclean()emumformulriodemodeloparafornecer
informaesadicionaiscomoumavalidao,damesmaformaquefarianumformulrio
normal.
Inthisregard,modelformshavetwospecificcharacteristicswhencomparedtoforms:
Porpadroomtodoclean()validaaunicidadedoscamposquesomarcadoscomo
unique,unique_togetherouunique_for_date|month|yearnomodelo.Portanto,se
vocgostariadesobrescreveromtodoclean()emanteravalidaopadro,vocdeve
chamaromtododaclean()daclassepai.
Also,amodelforminstanceboundtoamodelobjectwillcontainaself.instanceattribute
thatgivesmodelformmethodsaccesstothatspecificmodelinstance.

Heranadeformulrio
Comonosformulriosbsicos,vocpodeextenderereutilizarModelFormsatravsda
herana.Issotilsevocprecisadeclararcamposoumtodosadicionaisemumaclasse
paiparausoemalgunsformulriosderivadosdemodelos.Porexemplo,usandoaclasse
ArticleFormanterior:
>>> class EnhancedArticleForm(ArticleForm):
...
def clean_pub_date(self):
...
...

IssocriaumformulrioquesecomportadamesmamaneiraqueArticleForm,excetopor
algumavalidaoelimpezadedadosadicionalparaocampopub_date.
VocpodecriarumasubclassedaclasseinternaMetadaclassepaisevocquermudaras
listasMeta.fieldsouMeta.excludes:
>>> class RestrictedArticleForm(EnhancedArticleForm):
https://django-portuguese.readthedocs.org/en/1.0/topics/forms/modelforms.html

8/16

2/23/2016

Criando formulrios a partir de models Django 1.0 documentation

...
...

class Meta(ArticleForm.Meta):
exclude = ['body']

IssoadicionaomtododeEnhancedArticleFormemodificaoArticleForm.Meta
originalpararemoverumcampo.
Entretanto,existemalgumascoisasaseremnotadas.
AsregrasnormaisderesoluodenomesPythonseaplicam.Sevoctemmltiplas
classesbasequedeclaramumaclasseinternaMeta,somenteaprimeiraserutilizada.
IssosignificaoMetadofilho,seexistir,casocontrriooMetadoprimeiropai,etc.
Pelamesmarazo,umasubclassenopodeherdardeModelFormeForm
simultaneamente.
bemprovvelqueestasnotasnoteafetaro,anoserqueestejatentandofazeralgo
complexoutilizandosubclasses.

ModelFormsets
Comonosformsetscomuns,oDjangoforneceumpardeclassesavanadasdeformsetque
tornamfaciltrabalharcommodelosdoDjango.VamosreutilizaromodeloAuthordoexemplo
acima:
>>> from django.forms.models import modelformset_factory
>>> AuthorFormSet = modelformset_factory(Author)

Issocriarumformsetquecapazdefuncionarcomosdadosassociadosaomodelo
Authorquefuncionaexatamenteigualaumformsetcomum:

>>> formset = AuthorFormSet()


>>> print formset
<input type="hidden" name="form-TOTAL_FORMS" value="1" id="id_form-TOTAL_
<tr><th><label for="id_form-0-name">Name:</label></th><td><input id="id_f
<tr><th><label for="id_form-0-title">Title:</label></th><td><select name=
<option value="" selected="selected">---------</option>
<option value="MR">Mr.</option>
<option value="MRS">Mrs.</option>
<option value="MS">Ms.</option>
</select></td></tr>
<tr><th><label for="id_form-0-birth_date">Birth date:</label></th><td><in

https://django-portuguese.readthedocs.org/en/1.0/topics/forms/modelforms.html

9/16

2/23/2016

Criando formulrios a partir de models Django 1.0 documentation

Note
Umacoisaparasenotarquemodelformset_factoryusaformset_factorypara
gerarformsets.Istosignificaqueumformesetdemodelsomenteumaextensodeum
formsetbsicoquesabecomointeragircomummodelemparticular.

Mudandooqueryset
Porpadroquandovoccriaumformsetdeummodelooformsetirusarumquerysetque
incluitodososobjetosnomodelo(ex:Author.objects.all()).Vocpodesobrescrever
essecomportamentousandooargumentoqueryset:

>>> formset = AuthorFormSet(queryset=Author.objects.filter(name__startswi

Alternativamente,vocpodecriarumasubclassequedefinaoself.querysetno
__init__:
from django.forms.models import BaseModelFormSet
class BaseAuthorFormSet(BaseModelFormSet):
def __init__(self, *args, **kwargs):
self.queryset = Author.objects.filter(name__startswith='O'
super(BaseAuthorFormSet, self).__init__(*args, **kwargs)

Ento,passesuaclasseBaseAuthorFormSetparaafunofactory:

>>> AuthorFormSet = modelformset_factory(Author, formset=BaseAuthorFormSe

Controlandoquaiscampossousadoscomfieldseexclude
Porpadroummodelformsetusartodososcamposdomodel,quenoestomarcados
comeditable=False,Entretanto,istopodesersobrescritononveldoformset:
>>> AuthorFormSet = modelformset_factory(Author, fields=('name',

Usandofieldsvocirrestringiroformsetparausarsomenteoscamposfornecidos.
Alternativamente,vocpodeterumaabordagemde"output",especificandoquaiscampos
seroexcludos:

https://django-portuguese.readthedocs.org/en/1.0/topics/forms/modelforms.html

10/16

2/23/2016

Criando formulrios a partir de models Django 1.0 documentation

>>> AuthorFormSet = modelformset_factory(Author, exclude=('birth_date'

Usandoexcludevocirevistarquedadoscampossejamusadosemumformset.

Gravandoobjetosnumformset
ComonumModelFormvocpodegravarosdadosnoobjetodomodelo.Issofeitocomo
mtodosave()doformset:
# Cria uma instncia de formset com os dados do POST.
>>> formset = AuthorFormSet(request.POST)
# Supondo que tudo est vlido, grave os dados
>>> instances = formset.save()

Omtodosave()devolverasinstnciasqueforamgravadasnobancodedados.Seuma
instncianomudarseusnosdadosatreladoselanosergravadanobancoenoser
encontradanovalorderetorn(instancesnoexemploacima).
Passcommit=Falsetoreturntheunsavedmodelinstances:
# no grava no banco de dados
>>> instances = formset.save(commit=False)
>>> for instance in instances:
...
# faz alguma coisa com a instncia
...
instance.save()

Issodahabilidadedeanexardadossinstnciasantesdegravlasnobancodedados.
SeseuformsetcontmumManyToManyFieldvocprecisartambmchamar
formset.save_m2m()paraassegurarqueosrelacionamentosdemuitosparamuitossero
gravadosapropriadamente.

Limitandoonmerodeobjetoseditveis
Comoemformsetscomunsvocpodeusarumparmetromax_numno
modelformset_factoryparalimitaronmerodeformulriosmostrados.Comformsetsde
modelo,issolimitarapropriadamenteaqueryparaselecionarsomenteomximodeobjetos
necessrios:

>>> Author.objects.order_by('name')
[<Author: Charles Baudelaire>, <Author: Paul Verlaine>, <Author: Walt Whi
>>> AuthorFormSet = modelformset_factory(Author, max_num=2, extra
https://django-portuguese.readthedocs.org/en/1.0/topics/forms/modelforms.html

11/16

2/23/2016

Criando formulrios a partir de models Django 1.0 documentation

>>> formset = AuthorFormSet(queryset=Author.objects.order_by('name'


>>> formset.initial
[{'id': 1, 'name': u'Charles Baudelaire'}, {'id': 3, 'name': u'Paul Verla

Seovalordemax_nummaiorqueonmerodeobjetosretornados,formulriosembranco
extraseroadicionadosaoformset,tologoototaldeformulriosnoexcedamax_num:

>>> AuthorFormSet = modelformset_factory(Author, max_num=4, extra


>>> formset = AuthorFormSet(queryset=Author.objects.order_by('name'
>>> for form in formset.forms:
...
print form.as_table()
<tr><th><label for="id_form-0-name">Name:</label></th><td><input id="id_f
<tr><th><label for="id_form-1-name">Name:</label></th><td><input id="id_f
<tr><th><label for="id_form-2-name">Name:</label></th><td><input id="id_f
<tr><th><label for="id_form-3-name">Name:</label></th><td><input id="id_f

Usandoummodelformsetemumaviso
Modelsformsetssomuitosimilaresaformsets.Digamosquequeiramosapresentarum
formsetparaeditarinstnciasdomodeloAuthor:
def manage_authors(request):
AuthorFormSet = modelformset_factory(Author)
if request.method == 'POST':
formset = AuthorFormSet(request.POST, request.FILES)
if formset.is_valid():
formset.save()
# Faa algo.
else:
formset = AuthorFormSet()
return render_to_response("manage_authors.html", {
"formset": formset,
})

Comovocpodeveralgicadavisodeumformsetdemodelonodrasticamente
diferentedecomousarumformset"normal".Anicadiferenaquenoschamamos
formset.save()parasalvarosdadosnobancodedados.(Istofoidescritoacimaem
Gravandoobjetosnumformset.)

Sobrescrevendooclean()sobreummodel_formset
AssimcomocomModelForms,porpadroomtodoclean()deummodel_formsetir
validarsenenhumdostensdoformsetviolaasrestriesdeunicidadedoseumodel
https://django-portuguese.readthedocs.org/en/1.0/topics/forms/modelforms.html

12/16

2/23/2016

Criando formulrios a partir de models Django 1.0 documentation

(qualquerumaunique,unique_togetherouunique_for_date|month|year).Sevoc
quisersobrescreveromtodoclean()deummodel_formsetemanterestavalidao,
vocdevechamaromtodocleandaclassepai:
class MyModelFormSet(BaseModelFormSet):
def clean(self):
super(MyModelFormSet, self).clean()
# exemplo de validao customizada de forms do formset:
for form in self.forms:
# your custom formset validation
# sua validao personalizada de formset

Usandoumquerysetcustomizado
Comojfoidito,vocpodesobrescreveroquerysetpadrousadopelomodelformset:

def manage_authors(request):
AuthorFormSet = modelformset_factory(Author)
if request.method == "POST":
formset = AuthorFormSet(request.POST, request.FILES,
queryset=Author.objects.filter(name__star
if formset.is_valid():
formset.save()
# Faa algo.
else:
formset = AuthorFormSet(queryset=Author.objects.filter(name__star
return render_to_response("manage_authors.html", {
"formset": formset,
})

NotequenspassamosoargumentoquerysetemambososcasosPOSTeGETneste
exemplo.

Usandooformsetnotemplate
JtrsformasderenderizarumformsetnumtemplateDjango.
Primeiro,vocpodedeixaroformsetfazeramaiorpartedotrabalho:
<form method="POST" action="">
{{ formset }}
</form>

Segundo,vocpodemanualmenterenderizaroformset,masdeixeoformtrabalharporcontra
https://django-portuguese.readthedocs.org/en/1.0/topics/forms/modelforms.html

13/16

2/23/2016

Criando formulrios a partir de models Django 1.0 documentation

prpria:
<form method="POST" action="">
{{ formset.management_form }}
{% for form in formset.forms %}
{{ form }}
{% endfor %}
</form>

Quandovocrenderizarformulriosmanualmente,certifiquesederenderizaro
management_formcomomostradoacima.Vejaadocumentaodomanagementform.
Terceiro,vocpoderenderizarmanualmentecadacampo:
<form method="POST" action="">
{{ formset.management_form }}
{% for form in formset.forms %}
{% for field in form %}
{{ field.label_tag }}: {{ field }}
{% endfor %}
{% endfor %}
</form>

Sevocoptarporusaresteterceiromtodoevocnoiterarsobreoscamposcomumloop
{% for %},vocprecisarrenderizarachaveprimria.Porexemplo,sevocrenderizouos
camposnameeagedeummodel:
<form method="POST" action="">
{{ formset.management_form }}
{% for form in formset.forms %}
{{ form.id }}
<ul>
<li>{{ form.name }}</li>
<li>{{ form.age }}</li>
</ul>
{% endfor %}
</form>

Observecomopreciso,explicitamente,renderizar{{form.id}}.Istogarantequeoformset
domodel,nocasodoPOST,irfuncionarperfeitamente.(Esteexemploassumeumachave
primriachamadaid,certifiquesederenderizla.)

Formsetsemlinha(inline)
https://django-portuguese.readthedocs.org/en/1.0/topics/forms/modelforms.html

14/16

2/23/2016

Criando formulrios a partir de models Django 1.0 documentation

Formsetsemlinhaumapequenacamadadeabstraosobreosformsetsdemodel.Este
simplificamocasodetrabalharcomobjetosrelacionadosatravsdeumachaveestrangeira.
Suponhamosquevoctenhadoismodels:
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
author = models.ForeignKey(Author)
title = models.CharField(max_length=100)

Sevocquisercriarumformsetquepermitaeditarbookspertencentesaumauthorem
particular,vocpodefazeristo:
>>> from django.forms.models import inlineformset_factory
>>> BookFormSet = inlineformset_factory(Author, Book)
>>> author = Author.objects.get(name=u'Mike Royko')
>>> formset = BookFormSet(instance=author)

Note
inlineformset_factoryusamodelformset_factoryemarcacan_delete=True.

Maisdeumachaveestrangeiraparaomesmomodel
Seoseumodelcontmmaisdeumachaveestrangeiraparaomesmomodel,vocprecisar
resolveraambiguidademanualmenteutilizandofk_name.Porexemplo,considereoseguinte
model:
class Friendship(models.Model):
from_friend = models.ForeignKey(Friend)
to_friend = models.ForeignKey(Friend)
length_in_months = models.IntegerField()

Pararesolveristo,vocpodeusarfk_nameparainlineformset_factory:
>>> FriendshipFormSet = inlineformset_factory(Friend, Friendship,

Usandoumformsetemlinhaemumview
Vocpodequererproverumviewquepermiteumusurioeditarosobjetosrelacionadosde
https://django-portuguese.readthedocs.org/en/1.0/topics/forms/modelforms.html

15/16

2/23/2016

Criando formulrios a partir de models Django 1.0 documentation

ummodel.Aquitemumamaneiradesefazerisso:
def manage_books(request, author_id):
author = Author.objects.get(pk=author_id)
BookInlineFormSet = inlineformset_factory(Author, Book)
if request.method == "POST":
formset = BookInlineFormSet(request.POST, request.FILES,
if formset.is_valid():
formset.save()
# Do something.
else:
formset = BookInlineFormSet(instance=author)
return render_to_response("manage_books.html", {
"formset": formset,
})

ObservecomopassamosinstanceemambososcasosPOSTeGET.

https://django-portuguese.readthedocs.org/en/1.0/topics/forms/modelforms.html

16/16