Documente Academic
Documente Profesional
Documente Cultură
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
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
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
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
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
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
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
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
...
...
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:
https://django-portuguese.readthedocs.org/en/1.0/topics/forms/modelforms.html
9/16
2/23/2016
Note
Umacoisaparasenotarquemodelformset_factoryusaformset_factorypara
gerarformsets.Istosignificaqueumformesetdemodelsomenteumaextensodeum
formsetbsicoquesabecomointeragircomummodelemparticular.
Mudandooqueryset
Porpadroquandovoccriaumformsetdeummodelooformsetirusarumquerysetque
incluitodososobjetosnomodelo(ex:Author.objects.all()).Vocpodesobrescrever
essecomportamentousandooargumentoqueryset:
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:
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
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
Seovalordemax_nummaiorqueonmerodeobjetosretornados,formulriosembranco
extraseroadicionadosaoformset,tologoototaldeformulriosnoexcedamax_num:
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
(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
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
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
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