FoirmeachaLink to this heading
- class BaseFormSetLink to this definition
Is sraith teastartha é foirmshraith chun oibriú le foirmeacha iolracha ar an leathanach céanna. Is féidir é a bheith is fearr i gcomparáid le greille sonraí. Abair go bhfuil an fhoirm seo a leanas agat:
>>> from django import forms
>>> class ArticleForm(forms.Form):
... title = forms.CharField()
... pub_date = forms.DateField()
...
B'fhéidir gur mhaith leat ligean don úsáideoir roinnt alt a chruthú ag an am céanna. Chun foirm a chruthú as Airteagal Form déanfaí an méid seo a leanas:
>>> from django.forms import formset_factory
>>> ArticleFormSet = formset_factory(ArticleForm)
Tá rang formset cruthaithe agat anois darb ainm ArticleFormSet. Tugann an tacar foirmeacha a thaispeáint tugtar an cumas duit athrá a dhéanamh thar na foirmeacha sa tacar foirme agus iad a thaispeáint mar a dhéanfá le foirm rialta:
>>> formset = ArticleFormSet()
>>> for form in formset:
... print(form)
...
<div><label for="id_form-0-title">Title:</label><input type="text" name="form-0-title" id="id_form-0-title"></div>
<div><label for="id_form-0-pub_date">Pub date:</label><input type="text" name="form-0-pub_date" id="id_form-0-pub_date"></div>
Mar a fheiceann tú ní thaispeánann sé ach foirm folamh amháin. Tá líon na bhfoirmeacha folamh a thaispeántar á rialú ag an bparaiméadar breise. De réir réamhshocraithe, :func: ~django.forms.formsets.formsets.formset_factory sainmhíníonn foirm bhreise amháin; cruthóidh an sampla seo a leanas rang formset chun dhá fhoirm bán a thaispeáint:
>>> ArticleFormSet = formset_factory(ArticleForm, extra=2)
Formsets can be iterated and indexed, accessing forms in the order they were
created. You can reorder the forms by overriding the default
iteration and
indexing behavior if needed.
Sonraí tosaigh a úsáid le tacar foirmeLink to this heading
Is iad na sonraí tosaigh an rud a spreagann príomh-inúsáidteacht foirmshraith. Mar a thaispeántar thuas is féidir leat líon na bhfoirmeacha breise a shainiú. Is é an rud a chiallaíonn sé seo ná go bhfuil tú ag insint don fhoirm cé mhéad foirm bhreise atá le taispeáint i dteannta leis an líon foirmeacha a ghineann sé ó na sonraí tosaigh. Breathnaímid ar shampla:
>>> import datetime
>>> from django.forms import formset_factory
>>> from myapp.forms import ArticleForm
>>> ArticleFormSet = formset_factory(ArticleForm, extra=2)
>>> formset = ArticleFormSet(
... initial=[
... {
... "title": "Django is now open source",
... "pub_date": datetime.date.today(),
... }
... ]
... )
>>> for form in formset:
... print(form)
...
<div><label for="id_form-0-title">Title:</label><input type="text" name="form-0-title" value="Django is now open source" id="id_form-0-title"></div>
<div><label for="id_form-0-pub_date">Pub date:</label><input type="text" name="form-0-pub_date" value="2023-02-11" id="id_form-0-pub_date"></div>
<div><label for="id_form-1-title">Title:</label><input type="text" name="form-1-title" id="id_form-1-title"></div>
<div><label for="id_form-1-pub_date">Pub date:</label><input type="text" name="form-1-pub_date" id="id_form-1-pub_date"></div>
<div><label for="id_form-2-title">Title:</label><input type="text" name="form-2-title" id="id_form-2-title"></div>
<div><label for="id_form-2-pub_date">Pub date:</label><input type="text" name="form-2-pub_date" id="id_form-2-pub_date"></div>
Tá trí fhoirm san iomlán anois ag taispeáint thuas. Ceann amháin do na sonraí tosaigh a cuireadh isteach agus dhá fhoirm bhreise. Tabhair faoi deara freisin go bhfuilimid ag dul isteach i liosta foclóirí mar na sonraí tosaigh.
Má úsáideann tú tosaithe chun tacar foirme a thaispeáint, ba cheart duit an tosaitheach céanna a rith agus tú ag próiseáil aighneacht foirmeacha sin ionas gur féidir leis an tacar foirme a bhrath cé na foirmeacha a d'athraigh an t-úsáideoir. Mar shampla, b'fhéidir go mbeadh rud éigin cosúil le: ArticleFormSet (request.post, initial= [...]).
An líon uasta na bhfoirmeacha a theorannúLink to this heading
Tugann an paraiméadar max_num to:func: ~django.forms.formsets.formset_factory an cumas duit líon na bhfoirmeacha a thaispeánfaidh an formset a theorannú:
>>> from django.forms import formset_factory
>>> from myapp.forms import ArticleForm
>>> ArticleFormSet = formset_factory(ArticleForm, extra=2, max_num=1)
>>> formset = ArticleFormSet()
>>> for form in formset:
... print(form)
...
<div><label for="id_form-0-title">Title:</label><input type="text" name="form-0-title" id="id_form-0-title"></div>
<div><label for="id_form-0-pub_date">Pub date:</label><input type="text" name="form-0-pub_date" id="id_form-0-pub_date"></div>
Má tá luach max_num níos mó ná líon na míreanna atá ann cheana sna sonraí tosaigh, cuirfear foirmeacha bán breise suas le extra leis an tacar foirmeacha, fad nach mbeidh líon iomlán na bhfoirmeacha níos mó ná max_num. Mar shampla, má tá extra=2 agus max_num=2 agus má thosaítear an foirmshraith le mír initial amháin, taispeánfar foirm don mhír tosaigh agus foirm bán amháin.
Má sháraíonn líon na míreanna sna sonraí tosaigh max_num, taispeánfar gach foirm sonraí tosaigh beag beann ar luach max_num agus ní thaispeánfar aon fhoirmeacha breise. Mar shampla, má tá extra=3 agus max_num=1 agus má dhá mhír tosaigh an foirmeach a thosú, taispeánfar dhá fhoirm leis na sonraí tosaigh.
Cuireann luach max_num de None (an réamhshocrú) teorainn ard ar líon na bhfoirmeacha a thaispeántar (1000). Go praiticiúil tá sé seo coibhéiseach le haon teorainn.
By default, max_num only affects how many forms are displayed and does not
affect validation. If validate_max=True is passed to the
formset_factory(), then max_num will affect
validation. See bailite_max.
Uaslíon na bhfoirmeacha ionchasacha a theorannúLink to this heading
Ceadaíonn an paraiméadar absolute_max to:func: .formset_factory líon na bhfoirmeacha is féidir a dhéanamh a theorannú nuair a sholáthraítear sonraí POST `. Cosnaíonn sé seo i gcoinne ionsaithe ídithe cuimhne ag úsáid iarratais brionnaithe ``POST ``
>>> from django.forms.formsets import formset_factory
>>> from myapp.forms import ArticleForm
>>> ArticleFormSet = formset_factory(ArticleForm, absolute_max=1500)
>>> data = {
... "form-TOTAL_FORMS": "1501",
... "form-INITIAL_FORMS": "0",
... }
>>> formset = ArticleFormSet(data)
>>> len(formset.forms)
1500
>>> formset.is_valid()
False
>>> formset.non_form_errors()
['Please submit at most 1000 forms.']
Nuair is é absolute_max None ``, réamhshocraithe é go ``max_num + 1000. (Má tá `max_num None ``, réamhshocraithe é go ``2000).
Má tá absolute_max níos lú ná max_num, ardófar Error lua.
Bailíochtú FormsetLink to this heading
Tá bailíochtú le tacar foirme beagnach comhionann le Foirm ``rialta. Tá modh ``is_valid ar an tacar foirmeacha chun bealach áisiúil a sholáthar chun gach foirm sa tacar foirme a bhailíochtú:
>>> from django.forms import formset_factory
>>> from myapp.forms import ArticleForm
>>> ArticleFormSet = formset_factory(ArticleForm)
>>> data = {
... "form-TOTAL_FORMS": "1",
... "form-INITIAL_FORMS": "0",
... }
>>> formset = ArticleFormSet(data)
>>> formset.is_valid()
True
Níor chuireamar aon sonraí isteach chuig an tacar foirme a bhfuil foirm bhailí mar thoradh air. Tá an tacar foirmeacha cliste go leor chun neamhaird a dhéanamh ar fhoirmeacha breise nár athraíodh. Má sholáthraímid alt neamhbhailí:
>>> data = {
... "form-TOTAL_FORMS": "2",
... "form-INITIAL_FORMS": "0",
... "form-0-title": "Test",
... "form-0-pub_date": "1904-06-16",
... "form-1-title": "Test",
... "form-1-pub_date": "", # <-- this date is missing but required
... }
>>> formset = ArticleFormSet(data)
>>> formset.is_valid()
False
>>> formset.errors
[{}, {'pub_date': ['This field is required.']}]
Mar a fheicimid, is liosta é formset.errors a fhreagraíonn a n-iontrálacha do na foirmeacha sa tacar foirmeacha. Rinneadh bailíochtú do gach ceann den dá fhoirm, agus tá an teachtaireacht earráide ag súil leis le feiceáil don dara mír.
Díreach cosúil le gnáth-Foirm ``á n-úsáid, d'fhéadfadh tréithe HTML mar ``maxlength` a bheith san áireamh i ngach réimse i bhfoirmeacha foirmeacha le haghaidh bailíochtaithe brabhsálaí. Mar sin féin, ní chuimsíonn réimsí foirmeacha foirmeacha an tréith riachtan mar d'fhéadfadh an bailíochtú sin a bheith mícheart agus foirmeacha á gcur leis agus á scriosadh.
- BaseFormSet.total_error_count()Link to this definition
Chun a sheiceáil cé mhéad earráid atá sa fhoirmset, is féidir linn an modh total_error_count` a úsáid:
>>> # Using the previous example
>>> formset.errors
[{}, {'pub_date': ['This field is required.']}]
>>> len(formset.errors)
2
>>> formset.total_error_count()
1
Is féidir linn a sheiceáil freisin an bhfuil sonraí foirme difriúil ó na sonraí tosaigh (ie seoladh an fhoirm gan aon sonraí):
>>> data = {
... "form-TOTAL_FORMS": "1",
... "form-INITIAL_FORMS": "0",
... "form-0-title": "",
... "form-0-pub_date": "",
... }
>>> formset = ArticleFormSet(data)
>>> formset.has_changed()
False
An “Foirm Bainistíochta” a thuiscintLink to this heading
B'fhéidir gur thug tú faoi deara na sonraí breise (Form-Total_Forms, Form-Initial_Forms`) a bhí ag teastáil i sonraí an fhoirmscair thuas. Tá na sonraí seo ag teastáil don ``Foirm Bainistíochta ``. Úsáideann an tacar foirmeacha seo chun bailiúchán na bhfoirmeacha atá sa tacar foirme a bhainistiú. Mura gcuireann tú na sonraí bainistíochta seo ar fáil, beidh an tacar foirme neamhbhailí:
>>> data = {
... "form-0-title": "Test",
... "form-0-pub_date": "",
... }
>>> formset = ArticleFormSet(data)
>>> formset.is_valid()
False
Úsáidtear é chun súil a choinneáil ar cé mhéad cásanna foirme atá á thaispeáint. Má tá foirmeacha nua á chur agat trí JavaScript, ba cheart duit na réimsí comhaireamh san fhoirm seo a mhéadú freisin. Ar an láimh eile, má tá JavaScript á úsáid agat chun rudaí atá ann cheana a scriosadh, ansin ní mór duit a chinntiú go ndéantar na cinn atá á mbaintear marcáilte i gceart lena scriosadh trí Form-#-delete a chur san áireamh sna sonraí POST `. Táthar ag súil go mbeidh gach foirm i láthair sna sonraí `POST ``beag beann.
Tá an fhoirm bhainistíochta ar fáil mar thréith den tacar foirme féin. Agus tacar foirme á rindreáil i dteimpléad, is féidir leat na sonraí bainistíochta go léir a chur san áireamh trí ``{{my_formset.management_form}} `a rindreáil (ainm do thacar foirme a chur in ionad mar is cuí).
comhaireann_foirme_iomlán agus comhaireann_foirme_tosaitheLink to this heading
Tá cúpla modh ag BaseFormSet a bhfuil dlúthbhaint acu leis an ManagementForm, total_form_count` agus initial_form_count.
Tugann total_form_count líon iomlán na bhfoirmeacha sa tacar foirme seo ar ais. Tugann initial_form_count líon na bhfoirmeacha sa tacar foirme a rinneadh réamh-líonadh, agus úsáidtear é freisin chun a chinneadh cé mhéad foirm atá ag teastáil. Is dócha nach mbeidh ort riamh ceachtar de na modhanna seo a shárú, mar sin bí cinnte le do thoil go dtuigeann tú cad a dhéanann siad sula ndéanann siad é sin.
foirme_folamLink to this heading
Soláthraíonn BaseFormSet tréith bhreise empty_form a thugann sampla foirme le réimír __prefix__ le húsáid níos éasca i bhfoirmeacha dinimiciúla le JavaScript.
teachtaireachtaí earráidLink to this heading
Ligeann an argóint error_messages duit na teachtaireachtaí réamhshocraithe a ardóidh an foirmset a shárú. Pas isteach i bhfoclóir le heochracha a mheaitseálann leis na teachtaireachtaí earráide is mian leat a shárú. I measc na heochracha teachtaireachta earráide tá `too_few_forms', too_many_forms', agus `missing_management_form'. D'fhéadfadh go mbeadh % (num) d sna teachtaireachtaí earráide `too_few_forms' agus `too_many_forms', agus max_num, ina gcuirfear min_num` agus max_num in ionad min_num faoi seach.
Mar shampla, seo an teachtaireacht earráide réamhshocraithe nuair a bhíonn an fhoirm bhainistíochta in easnamh:
>>> formset = ArticleFormSet({})
>>> formset.is_valid()
False
>>> formset.non_form_errors()
['ManagementForm data is missing or has been tampered with. Missing fields: form-TOTAL_FORMS, form-INITIAL_FORMS. You may need to file a bug report if the issue persists.']
Agus seo teachtaireacht earráide saincheaptha:
>>> formset = ArticleFormSet(
... {}, error_messages={"missing_management_form": "Sorry, something went wrong."}
... )
>>> formset.is_valid()
False
>>> formset.non_form_errors()
['Sorry, something went wrong.']
Bailíochtú foirm saincheapthaLink to this heading
Tá modh glan ``ag tacar foirme cosúil leis an gceann ar rang ``Foirme. Seo an áit a shainmhíníonn tú do bhailíochtú féin a oibríonn ag an leibhéal foirmset:
>>> from django.core.exceptions import ValidationError
>>> from django.forms import BaseFormSet
>>> from django.forms import formset_factory
>>> from myapp.forms import ArticleForm
>>> class BaseArticleFormSet(BaseFormSet):
... def clean(self):
... """Checks that no two articles have the same title."""
... if any(self.errors):
... # Don't bother validating the formset unless each form is valid on its own
... return
... titles = set()
... for form in self.forms:
... if self.can_delete and self._should_delete_form(form):
... continue
... title = form.cleaned_data.get("title")
... if title in titles:
... raise ValidationError("Articles in a set must have distinct titles.")
... titles.add(title)
...
>>> ArticleFormSet = formset_factory(ArticleForm, formset=BaseArticleFormSet)
>>> data = {
... "form-TOTAL_FORMS": "2",
... "form-INITIAL_FORMS": "0",
... "form-0-title": "Test",
... "form-0-pub_date": "1904-06-16",
... "form-1-title": "Test",
... "form-1-pub_date": "1912-06-23",
... }
>>> formset = ArticleFormSet(data)
>>> formset.is_valid()
False
>>> formset.errors
[{}, {}]
>>> formset.non_form_errors()
['Articles in a set must have distinct titles.']
Tugtar ar an modh clean ``foirmeacha tar éis na modhanna ``Form.clean go léir a ghlaoch. Faighfear na hearráidí ag baint úsáide as an modh ``non_form_errors () ``ar an tacar foirme.
Déanfar earráidí neamh-fhoirme a thabhairt le aicme breise de neamhfhoirme chun cabhrú leo a idirdhealú ó earráidí foirm-shonracha. Mar shampla, bheadh cuma ``{{formset.non_form_errors}} `:
<ul class="errorlist nonform">
<li>Articles in a set must have distinct titles.</li>
</ul>
Líon na bhfoirmeacha i dtacar foirmeacha a bhailíochtúLink to this heading
Soláthraíonn Django cúpla bealach chun líon íosta nó uasta na bhfoirmeacha curtha isteach a bhailíochtú. Ba cheart d'iarratais a dteastaíonn bailíochtú níos inúsáidte uathu ar líon na bhfoirmeacha bailíochtú saincheaptha
bailite_maxLink to this heading
Má chuirtear validate_max=True chuig: :func: ~django.forms.formsets.formset_factory, seiceálfaidh bailíochtú freisin go bhfuil líon na bhfoirmeacha sa tacar sonraí, lúide iad siúd atá marcáilte le scriosadh, níos lú ná ``max_`num` nó cothrom le max_`num.
>>> from django.forms import formset_factory
>>> from myapp.forms import ArticleForm
>>> ArticleFormSet = formset_factory(ArticleForm, max_num=1, validate_max=True)
>>> data = {
... "form-TOTAL_FORMS": "2",
... "form-INITIAL_FORMS": "0",
... "form-0-title": "Test",
... "form-0-pub_date": "1904-06-16",
... "form-1-title": "Test 2",
... "form-1-pub_date": "1912-06-23",
... }
>>> formset = ArticleFormSet(data)
>>> formset.is_valid()
False
>>> formset.errors
[{}, {}]
>>> formset.non_form_errors()
['Please submit at most 1 form.']
validate_max=Bailíonn True i gcoinne max_num go docht fiú má sháraíodh max_num toisc go raibh méid na sonraí tosaigh a sholáthraíodh iomarcach.
Is féidir an teachtaireacht earráide a shaincheapadh tríd an teachtaireacht ``too_many_forms' a chur chuig an argóint:ref: formsets-error-messages.
bailate_minLink to this heading
Má chuirtear validate_min=True chuig: :func: ~django.forms.formsets.formset_factory, seiceálfaidh bailíochtú freisin go bhfuil líon na bhfoirmeacha sa tacar sonraí, lúide iad siúd atá marcáilte le scriosadh, níos mó ná ``min_`num` nó cothrom le min_`num.
>>> from django.forms import formset_factory
>>> from myapp.forms import ArticleForm
>>> ArticleFormSet = formset_factory(ArticleForm, min_num=3, validate_min=True)
>>> data = {
... "form-TOTAL_FORMS": "2",
... "form-INITIAL_FORMS": "0",
... "form-0-title": "Test",
... "form-0-pub_date": "1904-06-16",
... "form-1-title": "Test 2",
... "form-1-pub_date": "1912-06-23",
... }
>>> formset = ArticleFormSet(data)
>>> formset.is_valid()
False
>>> formset.errors
[{}, {}]
>>> formset.non_form_errors()
['Please submit at least 3 forms.']
Is féidir an teachtaireacht earráide a shaincheapadh tríd an teachtaireacht ``too_few_forms' a chur chuig argóint:ref: formsets-error-messages.
Déileáil le foirmeacha a ordú agus a scriosadhLink to this heading
Soláthraíonn an: Func: ~django.forms.formsets.formset_factory dhá pharaiméadar roghnach can_order agus can_delete chun cabhrú le foirmeacha a ordú i bhfoirmeacha agus foirmeacha a scriosadh ó fhoirmshraith.
``Is féidir _ordú ``Link to this heading
- BaseFormSet.can_orderLink to this definition
Réamhshocraithe: Fréag
Ligeann duit tacar foirme a chruthú leis an gcumas a ordú:
>>> from django.forms import formset_factory
>>> from myapp.forms import ArticleForm
>>> ArticleFormSet = formset_factory(ArticleForm, can_order=True)
>>> formset = ArticleFormSet(
... initial=[
... {"title": "Article #1", "pub_date": datetime.date(2008, 5, 10)},
... {"title": "Article #2", "pub_date": datetime.date(2008, 5, 11)},
... ]
... )
>>> for form in formset:
... print(form)
...
<div><label for="id_form-0-title">Title:</label><input type="text" name="form-0-title" value="Article #1" id="id_form-0-title"></div>
<div><label for="id_form-0-pub_date">Pub date:</label><input type="text" name="form-0-pub_date" value="2008-05-10" id="id_form-0-pub_date"></div>
<div><label for="id_form-0-ORDER">Order:</label><input type="number" name="form-0-ORDER" value="1" id="id_form-0-ORDER"></div>
<div><label for="id_form-1-title">Title:</label><input type="text" name="form-1-title" value="Article #2" id="id_form-1-title"></div>
<div><label for="id_form-1-pub_date">Pub date:</label><input type="text" name="form-1-pub_date" value="2008-05-11" id="id_form-1-pub_date"></div>
<div><label for="id_form-1-ORDER">Order:</label><input type="number" name="form-1-ORDER" value="2" id="id_form-1-ORDER"></div>
<div><label for="id_form-2-title">Title:</label><input type="text" name="form-2-title" id="id_form-2-title"></div>
<div><label for="id_form-2-pub_date">Pub date:</label><input type="text" name="form-2-pub_date" id="id_form-2-pub_date"></div>
<div><label for="id_form-2-ORDER">Order:</label><input type="number" name="form-2-ORDER" id="id_form-2-ORDER"></div>
Cuireann sé seo réimse breise le gach foirm. Ainmnítear ORDER ar an réimse nua seo agus is Forms.IntegerField é. Maidir leis na foirmeacha a tháinig ó na sonraí tosaigh sé luach uimhriúil dóibh go huathoibríoch. Breathnaímid ar cad a tharlóidh nuair a athraíonn an t-úsáideoir na luachanna seo:
>>> data = {
... "form-TOTAL_FORMS": "3",
... "form-INITIAL_FORMS": "2",
... "form-0-title": "Article #1",
... "form-0-pub_date": "2008-05-10",
... "form-0-ORDER": "2",
... "form-1-title": "Article #2",
... "form-1-pub_date": "2008-05-11",
... "form-1-ORDER": "1",
... "form-2-title": "Article #3",
... "form-2-pub_date": "2008-05-01",
... "form-2-ORDER": "0",
... }
>>> formset = ArticleFormSet(
... data,
... initial=[
... {"title": "Article #1", "pub_date": datetime.date(2008, 5, 10)},
... {"title": "Article #2", "pub_date": datetime.date(2008, 5, 11)},
... ],
... )
>>> for form in formset.ordered_forms:
... print(form.cleaned_data)
...
{'title': 'Article #3', 'pub_date': datetime.date(2008, 5, 1), 'ORDER': 0}
{'title': 'Article #2', 'pub_date': datetime.date(2008, 5, 11), 'ORDER': 1}
{'title': 'Article #1', 'pub_date': datetime.date(2008, 5, 10), 'ORDER': 2}
BaseFormSet also provides an
ordering_widget attribute and
get_ordering_widget() method that
control the widget used with
can_order.
ording_widgetLink to this heading
- BaseFormSet.ordering_widgetLink to this definition
Réamhshocraithe: :class: ~django.forms.numberInput
Socraigh ordering_widget chun an rang giuirléid atá le húsáid le can_order a shonrú:
>>> from django.forms import BaseFormSet, formset_factory
>>> from myapp.forms import ArticleForm
>>> class BaseArticleFormSet(BaseFormSet):
... ordering_widget = HiddenInput
...
>>> ArticleFormSet = formset_factory(
... ArticleForm, formset=BaseArticleFormSet, can_order=True
... )
faigh_ording_widgetLink to this heading
- BaseFormSet.get_ordering_widget()Link to this definition
Athraigh get_ordering_widget () ``más gá duit sampla giuirléid a sholáthar le húsáid le ``can_order:
>>> from django.forms import BaseFormSet, formset_factory
>>> from myapp.forms import ArticleForm
>>> class BaseArticleFormSet(BaseFormSet):
... def get_ordering_widget(self):
... return HiddenInput(attrs={"class": "ordering"})
...
>>> ArticleFormSet = formset_factory(
... ArticleForm, formset=BaseArticleFormSet, can_order=True
... )
`is féidir _scriosaLink to this heading
- BaseFormSet.can_deleteLink to this definition
Réamhshocraithe: Fréag
Ligeann duit tacar foirme a chruthú leis an gcumas foirmeacha a roghnú le scriosadh:
>>> from django.forms import formset_factory
>>> from myapp.forms import ArticleForm
>>> ArticleFormSet = formset_factory(ArticleForm, can_delete=True)
>>> formset = ArticleFormSet(
... initial=[
... {"title": "Article #1", "pub_date": datetime.date(2008, 5, 10)},
... {"title": "Article #2", "pub_date": datetime.date(2008, 5, 11)},
... ]
... )
>>> for form in formset:
... print(form)
...
<div><label for="id_form-0-title">Title:</label><input type="text" name="form-0-title" value="Article #1" id="id_form-0-title"></div>
<div><label for="id_form-0-pub_date">Pub date:</label><input type="text" name="form-0-pub_date" value="2008-05-10" id="id_form-0-pub_date"></div>
<div><label for="id_form-0-DELETE">Delete:</label><input type="checkbox" name="form-0-DELETE" id="id_form-0-DELETE"></div>
<div><label for="id_form-1-title">Title:</label><input type="text" name="form-1-title" value="Article #2" id="id_form-1-title"></div>
<div><label for="id_form-1-pub_date">Pub date:</label><input type="text" name="form-1-pub_date" value="2008-05-11" id="id_form-1-pub_date"></div>
<div><label for="id_form-1-DELETE">Delete:</label><input type="checkbox" name="form-1-DELETE" id="id_form-1-DELETE"></div>
<div><label for="id_form-2-title">Title:</label><input type="text" name="form-2-title" id="id_form-2-title"></div>
<div><label for="id_form-2-pub_date">Pub date:</label><input type="text" name="form-2-pub_date" id="id_form-2-pub_date"></div>
<div><label for="id_form-2-DELETE">Delete:</label><input type="checkbox" name="form-2-DELETE" id="id_form-2-DELETE"></div>
Cosúil le can_order cuireann sé seo réimse nua le gach foirm darb ainm DELETE agus is Forms.BooleanField é. Nuair a thagann sonraí trí aon cheann de na réimsí scriosta a mharcáil is féidir leat rochtain a fháil orthu le deleted_forms`:
>>> data = {
... "form-TOTAL_FORMS": "3",
... "form-INITIAL_FORMS": "2",
... "form-0-title": "Article #1",
... "form-0-pub_date": "2008-05-10",
... "form-0-DELETE": "on",
... "form-1-title": "Article #2",
... "form-1-pub_date": "2008-05-11",
... "form-1-DELETE": "",
... "form-2-title": "",
... "form-2-pub_date": "",
... "form-2-DELETE": "",
... }
>>> formset = ArticleFormSet(
... data,
... initial=[
... {"title": "Article #1", "pub_date": datetime.date(2008, 5, 10)},
... {"title": "Article #2", "pub_date": datetime.date(2008, 5, 11)},
... ],
... )
>>> [form.cleaned_data for form in formset.deleted_forms]
[{'title': 'Article #1', 'pub_date': datetime.date(2008, 5, 10), 'DELETE': True}]
Má tá a: class: ModelFormSet <django.forms.models.BaseModelFormSet>`á úsáid agat, scriosfar cásanna samhail d'fhoirmeacha scriosta nuair a ghlaonn tú ar ``formset.save () `.
If you call formset.save(commit=False), objects will not be deleted
automatically. You'll need to call delete() on each of the
formset.deleted_objects to actually delete
them:
>>> instances = formset.save(commit=False)
>>> for obj in formset.deleted_objects:
... obj.delete()
...
Ar an láimh eile, má tá simplí formSet ``á úsáid agat, is fútsa atá sé `formset.deleted_forms a láimhseáil, b'fhéidir i modh save ()` do fhoirmset, mar níl aon smaoineamh ginearálta ann faoi cad a chiallaíonn sé foirm a scriosadh.
BaseFormSet also provides a
deletion_widget attribute and
get_deletion_widget() method that
control the widget used with
can_delete.
scrios_widgetLink to this heading
- BaseFormSet.deletion_widgetLink to this definition
Réamhshocraithe: :class: ~django.forms.checkboxInput
Socraigh deletion_widget chun an rang giuirléid atá le húsáid le can_delete a shonrú:
>>> from django.forms import BaseFormSet, formset_factory
>>> from myapp.forms import ArticleForm
>>> class BaseArticleFormSet(BaseFormSet):
... deletion_widget = HiddenInput
...
>>> ArticleFormSet = formset_factory(
... ArticleForm, formset=BaseArticleFormSet, can_delete=True
... )
faigh_scrios_widgetLink to this heading
- BaseFormSet.get_deletion_widget()Link to this definition
Athraigh get_deletion_widget () ``más gá duit sampla giuirléid a sholáthar le húsáid le ``can_delete:
>>> from django.forms import BaseFormSet, formset_factory
>>> from myapp.forms import ArticleForm
>>> class BaseArticleFormSet(BaseFormSet):
... def get_deletion_widget(self):
... return HiddenInput(attrs={"class": "deletion"})
...
>>> ArticleFormSet = formset_factory(
... ArticleForm, formset=BaseArticleFormSet, can_delete=True
... )
`is féidir _scrios_breiseLink to this heading
- BaseFormSet.can_delete_extraLink to this definition
Réamhshocraithe: ``Fíor`
Agus tú ag socrú can_delete=True, bainfear an rogha chun foirmeacha breise a scriosadh can_delete_extra=false a shonrú.
Réimsí breise a chur le tacar foirmeachaLink to this heading
Más gá duit réimsí breise a chur leis an tacar foirme is féidir é seo a chur i gcrích go héasca. Soláthraíonn an bunaicme foirmset modh add_fields. Is féidir leat an modh seo a shárú chun do réimsí féin a chur leis nó fiú réimsí réamhshocraithe/tréithe na réimsí ordaithe agus scriostha a athshainiú:
>>> from django.forms import BaseFormSet
>>> from django.forms import formset_factory
>>> from myapp.forms import ArticleForm
>>> class BaseArticleFormSet(BaseFormSet):
... def add_fields(self, form, index):
... super().add_fields(form, index)
... form.fields["my_field"] = forms.CharField()
...
>>> ArticleFormSet = formset_factory(ArticleForm, formset=BaseArticleFormSet)
>>> formset = ArticleFormSet()
>>> for form in formset:
... print(form)
...
<div><label for="id_form-0-title">Title:</label><input type="text" name="form-0-title" id="id_form-0-title"></div>
<div><label for="id_form-0-pub_date">Pub date:</label><input type="text" name="form-0-pub_date" id="id_form-0-pub_date"></div>
<div><label for="id_form-0-my_field">My field:</label><input type="text" name="form-0-my_field" id="id_form-0-my_field"></div>
Ag dul paraiméadair saincheaptha chuig foirmeachaLink to this heading
Uaireanta glacann do rang foirme paraiméadair saincheaptha, cosúil le ``MyArticleForm ``. Is féidir leat an paraiméadar seo a rith agus an tacar foirmeacha á gcur isteach agat:
>>> from django.forms import BaseFormSet
>>> from django.forms import formset_factory
>>> from myapp.forms import ArticleForm
>>> class MyArticleForm(ArticleForm):
... def __init__(self, *args, user, **kwargs):
... self.user = user
... super().__init__(*args, **kwargs)
...
>>> ArticleFormSet = formset_factory(MyArticleForm)
>>> formset = ArticleFormSet(form_kwargs={"user": request.user})
Féadfaidh an form_kwargs ag brath ar an gcás foirme shonrach freisin. Soláthraíonn an bunaicme formset modh get_form_kwargs. Tógann an modh argóint amháin - innéacs na foirme sa tacar foirme. Is é None an t-innéacs fao:ref: empty_form:
>>> from django.forms import BaseFormSet
>>> from django.forms import formset_factory
>>> class BaseArticleFormSet(BaseFormSet):
... def get_form_kwargs(self, index):
... kwargs = super().get_form_kwargs(index)
... kwargs["custom_kwarg"] = index
... return kwargs
...
>>> ArticleFormSet = formset_factory(MyArticleForm, formset=BaseArticleFormSet)
>>> formset = ArticleFormSet()
Réimír foirmshraith a shaincheapadhLink to this heading
Sa HTML rindreáilte, cuimsíonn foirmeacha réimír ar ainm gach réimse. De réir réamhshocraithe, is é foirm an réimír, ach is féidir é a shaincheapadh ag baint úsáide as argóint prefix an fhoirmshraith.
Mar shampla, sa chás réamhshocraithe, b'fhéidir go bhfeicfidh tú:
<label for="id_form-0-title">Title:</label>
<input type="text" name="form-0-title" id="id_form-0-title">
Ach le ``ArticleFormSet (prefix='article') ``éiríonn sé sin:
<label for="id_article-0-title">Title:</label>
<input type="text" name="article-0-title" id="id_article-0-title">
<multiple-formsets-in-view>Tá sé seo úsáideach más mian leat: ref: `úsáid níos mó ná tacar foirme amháin i radharc `.
Foirmshraith a úsáid i radhairc agus teimpléidLink to this heading
Tá na tréithe agus na modhanna seo a leanas ag foirmeacha a bhaineann le rindreáil:
- BaseFormSet.rendererLink to this definition
Sonraíonn sé an: doc: renderer </ref/forms/renderers> le húsáid don fhoirmshraith. Réamhshocraithe don rindeoir a shonraítear leis an socrú: setting: FORM_RENDER.
- BaseFormSet.template_nameLink to this definition
Ainm an teimpléid a rinneadh má theilgtear an tacar foirme isteach i sreang, m.sh. trí
print (formset) ``nó i dteimpléad trí{{formset}} ``.De réir réamhshocraithe, maoin ag filleadh luach an renderer's:attr: ~django.forms.renderers.baserenderer.formset_template_name. Féadfaidh tú é a shocrú mar ainm teimpléad teaghrán d'fhonn é sin a shárú d'aicme foirmeacha áirithe.
Úsáidfear an teimpléad seo chun foirm bhainistíochta an fhoirmeacha a léiriú, agus ansin gach foirm sa tacar foirme de réir an teimpléid atá sainmhínithe ag an bhfoirm 's:attr: ~django.forms.form.template_name.
- BaseFormSet.template_name_divLink to this definition
Ainm an teimpléid a úsáidtear agus tú ag glaoch: meth: .as_div. De réir réamhshocraithe is é seo
” django/forms/formsets/div.html “. Déanann an teimpléad seo foirm bhainistíochta an fhoirm agus ansin gach foirm sa tacar foirme de réir an mhodh foirme's:meth: ~django.forms.form.as_div.
- BaseFormSet.template_name_pLink to this definition
Ainm an teimpléid a úsáidtear agus tú ag glaoch: meth: .as_p. De réir réamhshocraithe is é seo
” django/forms/formsets/p.html “. Déanann an teimpléad seo foirm bhainistíochta an fhoirm agus ansin gach foirm sa tacar foirme de réir an mhodh foirme's:meth: ~django.forms.form.as_p.
- BaseFormSet.template_name_tableLink to this definition
Ainm an teimpléid a úsáidtear agus tú ag glaoch: meth: .as_table. De réir réamhshocraithe is é seo
” django/forms/formsets/table.html “. Déanann an teimpléad seo foirm bhainistíochta an fhoirm agus ansin gach foirm sa tacar foirme de réir an mhodh foirme's:meth: ~django.forms.form.as_table.
- BaseFormSet.template_name_ulLink to this definition
Ainm an teimpléid a úsáidtear agus tú ag glaoch: meth: .as_ul. De réir réamhshocraithe is é seo
” django/forms/formsets/ul.html “. Déanann an teimpléad seo foirm bhainistíochta an fhoirm agus ansin gach foirm sa tacar foirme de réir an mhodh foirme's:meth: ~django.forms.form.as_ul.
- BaseFormSet.get_context()Link to this definition
Tugann sé an comhthéacs ar ais chun tacar foirme a rindreáil i dteimpléad.
Is é an comhthéacs atá ar fáil:
formset: An sampla den fhoirmset.
- BaseFormSet.render(template_name=None, context=None, renderer=None)Link to this definition
Tugtar
__str__ar an modh rindreála chomh maith leis na modhanna: meth: .as_div, :meth: .as_p, :meth: .as_ul, agus:meth: .as_table. Tá na hargóintí go léir roghnach agus beidh siad réamhshocraithe:ainmne_teimpléad: :attr: .template_ainmcontext: Luach ar ais ag: meth: .get_contextrenderer: Luach ar ais ar:attr: .renderer
- BaseFormSet.as_div()Link to this definition
Déanann sé an tacar foirme leis an teimpléad:attr: `.template_name_div.
- BaseFormSet.as_p()Link to this definition
Déanann sé an tacar foirme leis an teimpléad:attr: .template_name_p.
- BaseFormSet.as_table()Link to this definition
Déanann sé an tacar foirme leis an teimpléad:attr: .template_name_table.
- BaseFormSet.as_ul()Link to this definition
Déanann sé an tacar foirme leis an teimpléad:attr: .template_name_ul.
Níl sé an-difriúil le tacar foirme a úsáid taobh istigh de radharc ó rang rialta Foirme a úsáid. Is é an t-aon rud a theastaíonn uait a bheith ar an eolas faoi ná a chinntiú go n-úsáidtear an fhoirm bhainistíochta taobh istigh den teimpléad. Breathnaímid ar radharc samplach:
from django.forms import formset_factory
from django.shortcuts import render
from myapp.forms import ArticleForm
def manage_articles(request):
ArticleFormSet = formset_factory(ArticleForm)
if request.method == "POST":
formset = ArticleFormSet(request.POST, request.FILES)
if formset.is_valid():
# do something with the formset.cleaned_data
pass
else:
formset = ArticleFormSet()
return render(request, "manage_articles.html", {"formset": formset})
D'fhéadfadh cuma seo a bheith ar an teimpléad manage_articles.html`:
<form method="post">
{{ formset.management_form }}
<table>
{% for form in formset %}
{{ form }}
{% endfor %}
</table>
</form>
Mar sin féin tá aicearra beag ann don méid thuas trí ligean don fhoirmscar féin déileáil leis an bhfoirm bhainistíochta:
<form method="post">
<table>
{{ formset }}
</table>
</form>
Críochnaíonn an méid thuas ag glaoch ar an modh: meth: BaseFormSet.render ar an rang formset. Déanann sé seo an tacar foirme ag baint úsáide as an teimpléad a shonraítear leis an tréith: attr: ~BaseFormSet.Template_Name. Cosúil le foirmeacha, de réir réamhshocraithe déanfar an tacar foirme as_div, agus modhanna cúntóra eile as_p, as_ul`, agus as_table ar fáil. <overriding-built-in-formset-templates>Is féidir rindreáil an fhoirmshraith a shaincheapadh tríd an tréith template_name a shonrú, nó níos ginearálta trí:ref: `an teimpléad réamhshocraithe a shárú `.
Rinneadh de láimh can_delete agus can_orderLink to this heading
Má rindeann tú réimsí de láimh sa teimpléad, is féidir leat paraiméadar can_delete a rinneadh le {{form.Delete}}:
<form method="post">
{{ formset.management_form }}
{% for form in formset %}
<ul>
<li>{{ form.title }}</li>
<li>{{ form.pub_date }}</li>
{% if formset.can_delete %}
<li>{{ form.DELETE }}</li>
{% endif %}
</ul>
{% endfor %}
</form>
Ar an gcaoi chéanna, má tá sé de chumas ag an bhfoirm ordú (can_order=true), is féidir é a rinneadh le {{form.order}}.
Ag baint úsáide as níos mó ná tacar foirme amháin i radharcLink to this heading
Tá tú in ann níos mó ná tacar foirme amháin a úsáid i radharc más mian leat. Tá foirmeacha ar iasacht cuid mhaith dá iompar ó fhoirmeacha. Agus é sin ráite tá tú in ann prefix a úsáid chun ainmneacha réimse foirmeacha foirmeacha a bhfuil luach ar leith acu chun ligean níos mó ná tacar foirme amháin a sheoladh chuig amharc gan ainmneacha a chomhrac. Breathnaímid ar an gcaoi a bhféadfaí é seo a chur i gcrích:
from django.forms import formset_factory
from django.shortcuts import render
from myapp.forms import ArticleForm, BookForm
def manage_articles(request):
ArticleFormSet = formset_factory(ArticleForm)
BookFormSet = formset_factory(BookForm)
if request.method == "POST":
article_formset = ArticleFormSet(request.POST, request.FILES, prefix="articles")
book_formset = BookFormSet(request.POST, request.FILES, prefix="books")
if article_formset.is_valid() and book_formset.is_valid():
# do something with the cleaned_data on the formsets.
pass
else:
article_formset = ArticleFormSet(prefix="articles")
book_formset = BookFormSet(prefix="books")
return render(
request,
"manage_articles.html",
{
"article_formset": article_formset,
"book_formset": book_formset,
},
)
Ansin déanfá na foirmeacha a rinneadh mar is gnách. Tá sé tábhachtach a chur in iúl gur gá duit ``prefix` a rith ar na cásanna POST agus neamh-POST araon ionas go ndéanfar é a léiriú agus a phróiseáil i gceart.
Cuireann gach formset's:ref: réimír `in ionad an réimír réamh <formset-prefix>shocraithe ``foirm ``a chuirtear le tréithe HTML ``ainm` agus id` gach réimse.