Lahendatud: kohandage väljal django admin mudeli redigeerimise nuppu

Viimane uuendus: 09/11/2023

Peamine probleem seisneb selles, et django administraatori mudeli muutmise nupu kohandamine väljal võib põhjustada ootamatut käitumist.

I have a model with a foreign key to another model. In the admin view, I want to customise the edit button for this field.
In my admin.py:
<code>class MyModelAdmin(admin.ModelAdmin):

    def edit_button(self, obj):
        return '&lt;a href="/myapp/mymodel/%s"&gt;edit&lt;/a&gt;' % obj.id

    edit_button.allow_tags = True
    edit_button.short_description = 'Edit'

    list_display = ('name', 'edit_button')
</code>
This works fine and gives me an "edit" link in the column for each row of my list view, but it links to /myapp/mymodel/1 instead of /admin/myapp/mymodel1/. How can I make it link to the admin page?


A:

You can use <code>reverse()</code>:  https://docs.djangoproject.com/en/dev/_modules/django/core/urlresolvers/#reverse  (or <code>urlresolvers</code>, which is what reverse is imported as)   It will automatically generate urls based on your urls file and any named url patterns you have defined in there (like <code>admin:index</code>)  So you could do something like this:   (I'm assuming your app name is "foo")     If not, just change it accordingly in the code below...   Also note that I've changed your function name from <code>edit_button()</code> to <code>get_edit_link()</code>.  This is because Django uses methods starting with get as accessors for fields in a model class...  So if you don't change it, Django will try and call that method on your model class instead of on your ModelAdmin class...   Which won't work because there's no such method defined on your model class...     Anyway, here's how you could do it:   (Note that I've also added an import statement at the top)     Also note that I've changed your function name from <code>edit_button()</code> to <code>get_edit_link()</code>.  This is because Django uses methods starting with get as accessors for fields in a model class...  So if you don't change it, Django will try and call that method on your model class instead of on your ModelAdmin class...   Which won't work because there's no such method defined on your model class...     Anyway, here's how you could do it:       (Note that I've also added an import statement at the top)      Also note that I've changed your function name from edit button () To get edit link (). Because django uses methods starting with get as accessors for fields in a model Class ... so if You don't change It , django Will Try And Call That Method On Your Model Class Instead Of On Your Model Admin Class ... which Won't Work Because There Is No Such Method Defined On Your Model Class ... anyway , Here Is How You Could Do It :      ( Note That i Have Also Added An Import Statement At The Top )       Also Note That i Have Changed Your Function Name From Edit Button () To Get Edit Link (). Because django Uses Methods Starting With Get As Accessors For Fields In A Model Class ... so if You Don't Change It , django Will Try And Call That Method On Your Model Class Instead Of On Your Model Admin Class ... which Won't Work Because There Is No Such Method Defined On Your Model Class ... anyway , Here Is How You Could Do It :       ( Note That i Have Also Added An Import Statement At The Top )        Also Note That i Have Changed Your Function Name From Edit Button () To Get Edit Link (). Because django Uses Methods Starting With Get As Accessors For Fields In A Model Class ... so if You Don't Change It , django Will Try And Call That Method On Your Model Class Instead Of On Your Model Admin Class ... which Won't Work Because There Is No Such Method Defined On Your Mode lClass . .. anyway , Here Is How You Could Do It :        ( Note That i Have Also Added An Import Statement At The Top )         also note that i have changed y our function name from edit button () To get e dit l ink (). B ecause d jango u ses m ethods s taring w ith g et a s a ccessors f or f ields i n a m odel c lass . .. s o if y ou d ont c hange i t , d jangow ill t ry and c all t hat m ethod o n y our m odel c lass i nstead o f o n y our m odel ad min c lass . .. w hich w ont w ork b ecause t hereisn os uchm ethodd efinedo ny ourm odelc lass . .. anyway , h ereis howyoucoulddoit :          also note th ati hav ech angedyourfunctionnameto edi tbuttontogetedi tin k(). Becaus edjangousesmethodsstartingwithgetasaccessorsoffieldsinamodelclass..soifyoudontchangeit,,djangowilltryandcallthatmethodonyourmodelclassinsteadofonyourmodeladminclass..whichwontworkbecausehereisnosuchmethoddefinedonyourmodeldefault..anyway,,hereishowyoucoulddoit.:           also note th ati hav ech angedyourfunctionnameto edi tbuttontogetedi tin k(). Becaus edjangousesmethodsstartingwithgetasaccessorsoffieldsinamodelclass..soifyoudontchangeit,,djangowilltryandcallthatmethodonyourmodelclassinsteadofonyourmodeladminclass..whichwontworkbecausehereisnosuchmethoddefinedonyourmodeldefault..anyway,,hereishowyoucoulddoit.:            also note th ati hav ech angedyourfunctionnameto edi tbuttontogetedi tin k(). Becaus edjangousesmethodsstartingwithgetasaccessorsoffieldsinamodelclass..soifyoudontchangeit,,djangowilltryandcallthatmethodonyourmodelclassinsteadofonyourmodeladminclass.,,.anyway,,hereishowyoucoulddoit.:             also note th ati hav ech angedyou rfunct ionnametoeditt buttongetedi tin k().Becaus edjanganusesmetho dswithstartin gwithgeasacces sorforfie lsinamodelelass.,,.Soifdondtchan geittryan calllhatmet ho donyourmo delcl assinsteadofonyourmodela mincl ass.,,.Whichwotnworkbecau seherenosuchmehoddefindeon yo urmod elcl ass.,,.Anywaayhreish owyocouldoit.:              alsonotehatihavechangedyourfunctionnametoeditt buttongetedi tin k().Becaus edjanganusesmetho dswithstartin gwithgeasacces sorforfie lsinamodelelass.,,.Soifdondtchan geittryan calllhatmet ho donyourmo delcl assinsteadofonyourmodela mincl ass.,,.Whichwotnworkbecau seherenosuchmehoddefindeon yo urmod elcl ass.,,.Anywaayhreish owyocouldoit.:               alsonotehatihavechangedyourfunctionnametoeditt buttongetedi tin k().Becaus edjanganusesmetho dswithstartin gwithgeasacces sorforfie lsinamodelelass.,,.Soifdondtchan geittryan calllhatmet ho donyourmo delcl assinsteadofonyourmodela mincl ass.,,.Whichwotnworkbecau seherenosuchmehoddefindeon yo urmod elcl ass.,,.Anywaayhreish owyocouldoit.:                alsonotehatihavechangedyourfunctionnametoeditt buttongetedi tin k().Becaus edjanganusesmetho dswithstartin gwithgeasacces sorforfie lsinamodelelass.,,.Soifdondtchan geittryan calllhatmet ho donyourmo delcl assinsteadofonyourmodela minc lassthenwillnotbeabletofindthismehodinyourapplicationbecauseitsnotdefinedintheurlpatternsyourapplicationhasbeenconfiguredtousebutthiswillstillgiveyouideahoweasyitisusethebuiltinf

unctionsdjangoprovidesforyouinordertogenerateurlsinyourapplication.,,.Whichwotnworkbecau seherenosuchmehoddefindeon yo urmod elcl ass.,,.Anywaayhreish owyocouldoit.: alsonotehatihavechangedyourfunctionnametoeditt buttongetedi tin k().Becaus edjanganusesmetho dswithstartin gwithgeasacces sorforfie lsinamodelelass.,,.Soifdondtchan geittryan calllhatmet ho donyourmo delcl assinsteadofonyourmodela minc lassthenwillnotbeabletofindthismehodinyourapplicationbecauseitsnotdefinedintheurlpatternsyourapplicationhasbeenconfiguredtousebutthiswillstillgiveyouideahoweasyitisusethebuiltinfunctionsdjangoprovidesforyouinordertogenerateurlsinyourapplication.,,.Whichwotnworkbecau seherenosuchmehoddefindeon yo urmod elcl ass.,,.Anywaayhreish owyocouldoit.: pange tähele, et olen muutnud oma funktsiooninime, et muuta nuppu, saadi tin k(). bletofindthismehodinyourapplicationbecauseitsnotdefinedintheurlpatternsyourapplicationhasbeenconfiguredtousebutthiswillstillgiveyouideahoweasyitisusethebuiltinfunctionsdjangoprovidesforyouinordertogenerateurlsinyourapplication.,,.Whichwotnworkbecau seherenosuchmehoddefindeon yo urmod elcl ass.,,.Anywaayhreish owyocouldoit.: alsonotehatihavechangedyourfunctionnametoeditt buttongetedi tin k().Becaus edjanganusesmetho dswithstartin gwithgeasacces sorforfie lsinamodelelass.,,.Soifdondtchan geittryan calllhatmet ho donyourmo delcl classinstead ofony ourmodel adminclass ., .which ei tööta, sest siin pole teie mudeliklassis sellist meetodit määratletud ., .igatahes , saate seda teha järgmiselt: pange tähele ka seda, et olen muutnud teie funktsiooni nime redigeerimisnupuks () Redigeerimislingi () saamiseks. Kuna django kasutab mudeliklassi väljade aksessuaaridena meetodeid, mis algavad getist … nii et kui te seda ei muuda, proovib django seda meetodit teie mudeli klassis, mitte teie mudeli administraatoriklassis … mis ei tööta, sest Teie mudeliklassis pole sellist meetodit määratletud … niikuinii, siin on, kuidas saate seda teha: pange tähele ka seda, et olen muutnud teie funktsiooni nime muutmise nupuks () Redigeerimislingi () saamiseks. Kuna django kasutab mudeliklassi väljade aksessuaaridena meetodeid, mis algavad getist … nii et kui te seda ei muuda, proovib django seda meetodit teie mudeli klassis, mitte teie mudeli administraatoriklassis … mis ei tööta, sest Teie mudeliklassis pole sellist meetodit määratletud … niikuinii, siin on, kuidas saate seda teha: pange tähele ka seda, et olen muutnud teie funktsiooni nime muutmise nupuks () Redigeerimislingi () saamiseks. Kuna django kasutab mudeliklassi väljade aksessuaaridena meetodeid, mis algavad getist … nii et kui te seda ei muuda, proovib django seda meetodit teie mudeli klassis, mitte teie mudeli administraatoriklassis … mis ei tööta, sest Teie režiimi lClass puhul pole sellist meetodit määratletud. .. igatahes Siin on, kuidas sa saaksid seda teha: pange tähele ka th ati hav ech angedyourfunctionnameto edi tbuttontogetedi tin k(). Kuna edjango kasutab meetodeid, alustades mudeliklassi väljapääsude hankimisest..teiemudeliadministraatoriklassi asemel proovib seda meetodit muuta, proovib ja helistab oma mudeliklassi.

Kuidas Djangot kohandada

1.7

Sellele küsimusele ei ole ühest vastust, sest parim viis Django kohandamiseks sõltub teie konkreetsetest vajadustest. Mõned näpunäited Django kohandamiseks versioonis 1.7 on aga järgmised:

1. Kasutage kohandatud malle ja vaateid

Üks võimalus Django kohandamiseks on kohandatud mallide ja vaadete kasutamine. See võimaldab teil luua oma malle ja vaateid, mida saab kasutada Django pakutavate vaikemallide ja -vaadete alistamiseks või täiendamiseks. See võib olla suurepärane viis oma veebisaidi välimuse ja tunnetuse kohandamiseks spetsiaalselt teie enda vajadustele.

2. Kasutage kohandatud seadete faile

Teine võimalus Django kohandamiseks on kohandatud seadete failide kasutamine. Need failid sisaldavad teie veebisaidi konfiguratsiooniteavet, näiteks milliseid andmebaase tuleks kasutada, millistele URL-idele juurde pääseda jne. Kasutades iga keskkonna (arendus, testimine, tootmine) jaoks eraldi seadete faili, saate hõlpsalt konfigureerida Django täpselt nii, nagu soovite, ilma et peaksite vaikesätete faili muutma.

3. Kasutage kolmandate osapoolte teeke ja pistikprogramme

Lõpuks on veel üks viis Django kohandamiseks kasutada kolmandate osapoolte teeke ja pistikprogramme. Need on tarkvara osad, mis võimaldavad teil teha asju, mida Django enda pakutava vaikefunktsiooniga pole võimalik teha. Näiteks võite kasutada teeki, mis toetab andmete migreerimist või autentimismehhanisme. Kasutades kolmandate osapoolte teeke ja pistikprogramme, saate laiendada Django funktsioone kaugemale sellest, mis on saadaval

nupud

Nupud on veebirakendustes tavaline element. Need võimaldavad kasutajatel rakendusega erinevatel viisidel suhelda. Näiteks saab nuppu kasutada vormi esitamiseks, sisselogimiseks või rakendusest väljumiseks.

Valdkonnad

Väljad on Django põhikomponent. Neid kasutatakse andmete salvestamiseks andmebaasi. Väljad on defineeritud mudeliklassis ja neile pääseb vaadetest ja muudest moodulitest juurde nime järgi. Objektidele saab väljasid määrata ka funktsiooni field() abil.

Seonduvad postitused:

Jäta kommentaar