gníomhartha riaracháinLink to this heading

Is é sreabhadh oibre bunúsach riaracháin Django, go hachomair, “roghnaigh réad, ansin athraigh é.” Oibríonn sé seo go maith le haghaidh formhór na gcásanna úsáide. Mar sin féin, más gá duit an t-athrú céanna a dhéanamh ar go leor rudaí ag an am céanna, is féidir leis an sreabhadh oibre seo a bheith an-teannach.

Sna cásanna seo, ligeann riarachán Django duit “gníomhartha” a scríobh agus a chlárú - feidhmeanna a ghlaofar le liosta rudaí a roghnaítear ar leathanach an liosta athraithe.

Má fhéachann tú ar aon liosta athraithe sa riarachán, feicfidh tú an ghné seo i ngníomh; Seolann Django le gníomh “scrios rudaí roghnaithe” atá ar fáil do gach samhail. Mar shampla, seo an modúl úsáideora ó aip ionsuite Django: mod: django.contrib.auth:

/ga/5.2/_images/admin-actions.png

Léigh ar aghaidh chun a fháil amach conas do ghníomhartha féin a chur leis an liosta seo.

Gníomhartha scríLink to this heading

Is é an bealach is éasca le gníomhartha a mhíniú trí shampla, mar sin déanaimis tumadh isteach.

Cás úsáide coitianta do ghníomhartha riaracháin is ea an mórchnuashonrú ar mhúnla. Samhlaigh feidhmchlár nuachta le samhail Airteagal:

Code
from django.db import models

STATUS_CHOICES = {
    "d": "Draft",
    "p": "Published",
    "w": "Withdrawn",
}


class Article(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    status = models.CharField(max_length=1, choices=STATUS_CHOICES)

    def __str__(self):
        return self.title

Tasc coitianta a d'fhéadfaimis a dhéanamh le samhail mar seo ná stádas alt a nuashonrú ó “dréacht” go “foilsithe”. D'fhéadfaimis é seo a dhéanamh go héasca san riarachán alt amháin ag an am, ach dá dteastaíonn uainn grúpa alt a fhoilsiú go mór, bheadh sé deacair. Mar sin, déanaimis gníomh a scríobh a ligeann dúinn stádas alt a athrú go “foilsithe.”

Feidhmeanna gníomhaíochtaLink to this heading

Ar dtús, beidh orainn feidhm a scríobh a ghlaofar nuair a spreagtar an gníomh ón riarachán. Is feidhmeanna rialta iad feidhmeanna gníomhaíochta a thógann trí argóint:

  • An reatha: aicme: ModelAdmin

  • An:class: ~django.http.httpRequest a léiríonn an t-iarratas reatha,

  • A: Class: ~django.db.models.query.querySet ina bhfuil an tacar rudaí a roghnaigh an t-úsáideoir.

Ní bheidh an: class: ModelAdmin nó an réad iarratais ag teastáil ó ár bhfeidhm foilsithe seo, ach úsáidfimid an tacar ceisteanna:

Code
def make_published(modeladmin, request, queryset):
    queryset.update(status="p")

Sin i ndáiríre gach rud atá ann chun gníomh a scríobh! Mar sin féin, glacfaimid céim roghnach ach úsáideach amháin eile agus tabharfaimid teideal “deas” don ghníomh sa riarachán. De réir réamhshocraithe, bheadh an gníomh seo le feiceáil ar an liosta gníomhaíochta mar “Déan foilsithe” - ainm na feidhme, le spásanna ina ionad béim. Tá sé sin go breá, ach is féidir linn ainm níos fearr, níos cairdiúla don duine a sholáthar tríd an maisitheoir: func: ~django.contrib.admin.action a úsáid ar an bhfeidhm ``make_published ``:

Code
from django.contrib import admin

...


@admin.action(description="Mark selected stories as published")
def make_published(modeladmin, request, queryset):
    queryset.update(status="p")

Gníomhartha a chur leis an:class: ModelAdminLink to this heading

Ansin, beidh orainn ár n:class: ModelAdmin a chur ar an eolas faoin ngníomh. Oibríonn sé seo díreach cosúil le haon rogha cumraíochta eile. Mar sin, bheadh cuma ar an admin.py` iomlán leis an ngníomh agus a chlárú:

Code
from django.contrib import admin
from myapp.models import Article


@admin.action(description="Mark selected stories as published")
def make_published(modeladmin, request, queryset):
    queryset.update(status="p")


class ArticleAdmin(admin.ModelAdmin):
    list_display = ["title", "status"]
    ordering = ["title"]
    actions = [make_published]


admin.site.register(Article, ArticleAdmin)

Tabharfaidh an cód sin liosta athraithe riaracháin dúinn a bhfuil cuma mar seo air:

/ga/5.2/_images/adding-actions-to-the-modeladmin.png

Sin go léir atá ann i ndáiríre! Má tá tú ag iarraidh do ghníomhartha féin a scríobh, tá a fhios agat anois go leor chun tosú. Clúdaíonn an chuid eile den doiciméad seo teicnící níos airde.

Earráidí láimhseála i ngnLink to this heading

Má tá coinníollacha earráide intuartha ann a d'fhéadfadh tarlú agus do ghníomh á reáchtáil, ba cheart duit an t-úsáideoir a chur ar an eolas go grásta faoin bhfadhb. Ciallaíonn sé seo eisceachtaí a láimhseáil agus úsáid: meth: django.contrib.admin.modeladmin.message_user chun cur síos atá cairdiúil don úsáideoir ar an bhfadhb sa fhreagra a thaispeáint.

Teicnící gníomhaíochta chunLink to this heading

Tá cúpla rogha agus féidearthachtaí breise ann is féidir leat leas a bhaint as le haghaidh roghanna níos airde.

Gníomhartha cosúil:class: ModelAdmin modhannaLink to this heading

Taispeánann an sampla thuas an gníomh make_published a shainmhínítear mar fheidhm. Tá sé sin go breá, ach níl sé foirfe ó thaobh dearaidh cód: ós rud é go bhfuil an gníomh ceangailte go docht leis an réad Airteagal, tá sé ciallmhar an gníomh a cheangal leis an réad ``ArticleAdMin` féin.

Is féidir leat é a dhéanamh mar seo:

Code
class ArticleAdmin(admin.ModelAdmin):
    ...

    actions = ["make_published"]

    @admin.action(description="Mark selected stories as published")
    def make_published(self, request, queryset):
        queryset.update(status="p")

Tabhair faoi deara ar dtús gur bhogamar make_published isteach i modh agus athainmníomar an paraiméadar modeladmin ``go `self, agus sa dara háit gur chuireamar an teaghrán `make_published'` anois i ``actions in ionad tagairt feidhme díreach. Insíonn sé seo la:class: ModelAdmin breathnú suas ar an ngníomh mar mhodh.

Tugann gníomhartha a shainmhíniú mar mhodhanna rochtain níos idiomatiúla don ghníomhaíocht ar an: class: ModelAdmin féin, rud a ligeann don ghníomh aon cheann de na modhanna a sholáthraíonn an riarachán a ghlaoch.

Mar shampla, is féidir linn féin a úsáid chun teachtaireacht a splancadh chuig an úsáideoir in iúl dóibh gur éirigh leis an ngníomh:

Code
from django.contrib import messages
from django.utils.translation import ngettext


class ArticleAdmin(admin.ModelAdmin):
    ...

    def make_published(self, request, queryset):
        updated = queryset.update(status="p")
        self.message_user(
            request,
            ngettext(
                "%d story was successfully marked as published.",
                "%d stories were successfully marked as published.",
                updated,
            )
            % updated,
            messages.SUCCESS,
        )

Déanann sé seo an gníomh a mheaitseáil leis an méid a dhéanann an riarachán féin tar éis gníomh a dhéanamh go rathúil:

/ga/5.2/_images/actions-as-modeladmin-methods.png

Gníomhartha a sholáthraíonn leathanaighLink to this heading

De réir réamhshocraithe, tar éis gníomh a dhéanamh atreoraítear an t-úsáideoir ar ais chuig an leathanach liosta athraithe bunaidh. Mar sin féin, beidh ar roinnt gníomhartha, go háirithe cinn níos casta, leathanaigh idirmheánacha a thabhairt ar ais. Mar shampla, iarrann an gníomh scriosta ionsuite deimhniú sula ndéanann siad na rudaí roghnaithe a scriosadh.

Chun leathanach idirghabhála a sholáthar, cuir ar ais an:class: ~django.http.httpResponse (nó fo-aicme) ó do ghníomhaíocht. Mar shampla, d'fhéadfá feidhm onnmhairiúcháin a scríobh a úsáideann django's:doc: feidhmeanna sraitheach chun roinnt rudaí roghnaithe a dhumpáil mar </topics/serialization> JSON:

Code
from django.core import serializers
from django.http import HttpResponse


def export_as_json(modeladmin, request, queryset):
    response = HttpResponse(content_type="application/json")
    serializers.serialize("json", queryset, stream=response)
    return response

Go ginearálta, ní mheastar gur smaoineamh iontach é rud éigin mar an méid thuas. An chuid is mó den am, is é an cleachtas is fearr ná filleadh an:class: ~django.http.http.HttpResponsereDirect agus an t-úsáideoir a atreorú chuig radharc a scríobh tú, ag dul ar liosta na rudaí roghnaithe sa teaghrán ceisteanna GET. Ligeann sé seo duit loighic idirghníomhú casta a sholáthar ar na leathanaigh idir Mar shampla, más mian leat feidhm easpórtála níos iomláine a sholáthar, ba mhaith leat ligean don úsáideoir formáid a roghnú, agus b'fhéidir liosta réimsí le cur san onnmhairiú. Is é an rud is fearr le déanamh ná gníomh beag a scríobh a atreoraíonn chuig do radharc saincheaptha onnmhairithe:

Code
from django.contrib.contenttypes.models import ContentType
from django.http import HttpResponseRedirect


def export_selected_objects(modeladmin, request, queryset):
    selected = queryset.values_list("pk", flat=True)
    ct = ContentType.objects.get_for_model(queryset.model)
    return HttpResponseRedirect(
        "/export/?ct=%s&ids=%s"
        % (
            ct.pk,
            ",".join(str(pk) for pk in selected),
        )
    )

Mar a fheiceann tú, tá an gníomh sách gearr; bheadh an loighic chasta go léir i do dhearcadh onnmhairithe. Bheadh sé seo déileáil le rudaí de chineál ar bith, dá bhrí sin an gnó leis an “ContentType”.

Fágtar an dearcadh seo a scríobh mar chleachtadh don léitheoir.

Gníomhartha a chur ar fáil ar fud an suíomhLink to this heading

AdminSite.add_action(action, name=None)Link to this definition

Is fearr roinnt gníomhartha má chuirtear iad ar fáil dó* aon réad ar shuíomh riaracháin - is iarrthóir maith a bheadh an gníomh onnmhairithe a shainmhínítear thuas. Is féidir leat gníomh a chur ar fáil ar fud an domhain ag baint úsáid:meth: `adminsite.add_action () `. Mar shampla:

Code
from django.contrib import admin

admin.site.add_action(export_selected_objects)

Fágann sé seo an gníomh export_selected_objects ar fáil ar fud an domhain mar ghníomh darb ainm “export_selected_objects”. Is féidir leat ainm a thabhairt go sainráite don ghníomh -- go maith más mian leat go cláraitheach níos déanaí:ref: bain an gníomh <disabling-admin-actions>-- tríd an dara argóint a rith chuig:meth: adminsite.add_action ():

Code
admin.site.add_action(export_selected_objects, "export_selected")

Gníomhartha díchumasaitheLink to this heading

Uaireanta ní mór duit gníomhartha áirithe a dhíchumasú - go háirithe iad siú:ref: cláraithe ar fud an láithreáin <adminsite-actions>- le haghaidh rudaí áirithe. Tá cúpla bealach ann is féidir leat gníomhartha a dhíchumasú:

Gníomh ar fud an láithreáin a dhíchumasúLink to this heading

AdminSite.disable_action(name)Link to this definition

Más gá duit a: ref: gníomh ar fud an láithreáin `a dhíchumasú is féidir leat glaoch ar: <adminsite-actions>meth: `adminsite.disable_action ().

Mar shampla, is féidir leat an modh seo a úsáid chun an gníomh ionsuite “scrios rudaí roghnaithe” a bhaint:

Code
admin.site.disable_action("delete_selected")

Nuair a bheidh an méid thuas déanta agat, ní bheidh an gníomh sin ar fáil ar fud an láithreáin a thuilleadh.

Más gá duit, áfach, gníomh faoi mhíchumas domhanda a athchumasú do mhúnla áirithe amháin, liostaigh é go sainráite i do liosta ``ModelAdmin.Actions`:

Code
# Globally disable delete selected
admin.site.disable_action("delete_selected")


# This ModelAdmin will not have delete_selected available
class SomeModelAdmin(admin.ModelAdmin):
    actions = ["some_other_action"]
    ...


# This one will
class AnotherModelAdmin(admin.ModelAdmin):
    actions = ["delete_selected", "a_third_action"]
    ...

Gach gníomh a dhíchumasú le haghaidh áirithe: class: ModelAdminLink to this heading

Más mian leat mórghníomhaíochtaí no ar fáil le haghaidh tugadh: class: ModelAdmin, socraí:attr: ModelAdmin.actions go None:

Code
class MyModelAdmin(admin.ModelAdmin):
    actions = None

<adminsite-actions>Insíonn sé seo la:class: ModelAdmin gan aon ghníomhartha a thaispeáint ná a cheadú, lena n-áirítear aon ghníomhartha: ref: `láithreáin ghníomhartha `.

gníomhartha a chumasú nó a dhíchumasúLink to this heading

ModelAdmin.get_actions(request)Link to this definition

Faoi dheireadh, is féidir leat gníomhartha a chumasú nó a dhíchumasú go coinníollach ar aghaidh iarratais (agus dá bhrí sin in aghaidh an úsáideora) trí:meth: ModelAdmin.get_actions a ró-dhiaidh.

Tugann sé seo foclóir gníomhartha ceadaithe ar ais. Is ainmneacha gníomhaíochta iad na heochracha, agus is iad na luachanna (feidhm, ainm, gearr_description) tuples.

Mar shampla, mura dteastaíonn uait ach go mbeidh úsáideoirí a dtosaíonn a n-ainmneacha le 'J' in ann rudaí a scriosadh ar an mórchóir:

Code
class MyModelAdmin(admin.ModelAdmin):
    ...

    def get_actions(self, request):
        actions = super().get_actions(request)
        if request.user.username[0].upper() != "J":
            if "delete_selected" in actions:
                del actions["delete_selected"]
        return actions

Ceadanna a shocrú le haghaidh gníomharLink to this heading

Féadfaidh gníomhartha a n-infhaighteacht a theorannú d'úsáideoirí a bhfuil ceadanna sonracha acu tríd an bhfeidhm ghníomhaíochta a fhilleadh leis an maisitheoir: func: ~django.contrib.admin.action agus an argóint ceadúna a rith:

Code
@admin.action(permissions=["change"])
def make_published(modeladmin, request, queryset):
    queryset.update(status="p")

Ní bheidh an gníomh ``make_published () ``ar fáil ach d'úsáideoirí a rachaidh an seice:meth: .modeladmin.has_change_permission.

Má tá níos mó ná cead amháin ag ceadúnaí, beidh an gníomh ar fáil chomh fada agus a rachaidh an t-úsáideoir ceann amháin de na seiceálacha ar a laghad.

Is iad na luachanna atá ar fáil le haghaidh `ceadui' agus na seiceálacha modh comhfhreagracha:

  • 'add': :meth: .ModelAdmin.has_Add_Permission

  • 'athraithe: :meth: .modelAdmin.has_Change_Ceadúnaí

  • 'delete': :meth: .modeladmin.has_delete_ceadúnaí

  • 'view': :meth: .modeladmin.has_view_permission

Is féidir leat aon luach eile a shonrú chomh fada agus a chuireann tú modh comhfhreagrach hais_ <value>_cead (féin, iarraidh) ``i bhfeidhm ar an `ModelAdmin.

Mar shampla:

Code
from django.contrib import admin
from django.contrib.auth import get_permission_codename


class ArticleAdmin(admin.ModelAdmin):
    actions = ["make_published"]

    @admin.action(permissions=["publish"])
    def make_published(self, request, queryset):
        queryset.update(status="p")

    def has_publish_permission(self, request):
        """Does the user have the publish permission?"""
        opts = self.opts
        codename = get_permission_codename("publish", opts)
        return request.user.has_perm("%s.%s" % (opts.app_label, codename))

An maisitheoir gníomhaLink to this heading

action(*, permissions=None, description=None)Link to this definition

Is féidir an maisitheoir seo a úsáid chun tréithe sonracha a shocrú ar fheidhmeanna gníomhaíochta saincheaptha is féidir a úsáid le:attr: ~django.contrib.admin.modelAdmin.actions:

Code
@admin.action(
    permissions=["publish"],
    description="Mark selected stories as published",
)
def make_published(self, request, queryset):
    queryset.update(status="p")

Tá sé seo comhionann le roinnt tréithe (leis na hainmneacha bunaidh, níos faide) a shocrú go díreach ar an bhfeidhm:

Code
def make_published(self, request, queryset):
    queryset.update(status="p")


make_published.allowed_permissions = ["publish"]
make_published.short_description = "Mark selected stories as published"

Níl sé éigeantach an maisitheoir seo a úsáid chun feidhm ghníomhaíochta a dhéanamh, ach d'fhéadfadh sé a bheith úsáideach é a úsáid gan argóintí mar mharcóir i do fhoinse chun cuspóir na feidhme a aithint:

Code
@admin.action
def make_inactive(self, request, queryset):
    queryset.update(is_active=False)

Sa chás seo ní chuirfidh sé aon tréithe leis an bhfeidhm.

Tá tuairiscí gníomhaíochta %-formáidithe agus d'fhéadfadh go mbeadh '% (verbose_name) s' agus `% (verbose_name_plural) s' iontu, a chuirtear na samhlacha 's:attr: ~django.db.models.options.verbose_name agus:attr: ~django.db.models.options.options.Verbose_Ainm_Plural.