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:

Python console
>>> 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:

Python console
>>> 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:

Python console
>>> 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:

Python console
>>> 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 __iter__() and __getitem__() methods if needed. (For more information on implementing these methods, see the Python documentation on sequences.)

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:

Python console
>>> 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ú:

Python console
>>> 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 ``

Python console
>>> 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. modh ``is_valid ar an tacar foirmeacha chun bealach áisiúil a sholáthar chun gach foirm sa tacar foirme a bhailíochtú:

Python console
>>> 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í:

Python console
>>> 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:

Python console
>>> # 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í):

Python console
>>> 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í:

Python console
>>> 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:

Python console
>>> 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:

Python console
>>> 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:

Python console
>>> 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}} `:

Django template
<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.

Python console
>>> 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.

Python console
>>> 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ú:

Python console
>>> 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:

Python console
>>> 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ú:

Python console
>>> 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 duit sampla giuirléid a sholáthar le húsáid le ``can_order:

Python console
>>> 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:

Python console
>>> 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`:

Python console
>>> 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:

Python console
>>> 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á `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ú:

Python console
>>> 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 duit sampla giuirléid a sholáthar le húsáid le ``can_delete:

Python console
>>> 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ú:

Python console
>>> 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:

Python console
>>> 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:

Python console
>>> 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ú:

Html
<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:

Html
<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_ainm

  • context: Luach ar ais ag: meth: .get_context

  • renderer: 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:

Code
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`:

Django template
<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:

Django template
<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}}:

Django template
<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:

Code
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.