Løst: tilpass django admin rediger modellknapp i feltet

Hovedproblemet er at tilpasning av django admin edit model-knappen i et felt kan føre til uventet oppførsel.

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="/no/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.: alsonotehatiharechangedyourfunctionnametoeditt buttongetedi tin k().Fordi edjanganusesmetho dswithstartin gwithgeasaccesssorforfie lsina. 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 vil ikke fungere fordi her er ingen slik metode definert på modellklassen din., .allikevel, her er hvordan du kan gjøre det: merk også at jeg har endret funksjonsnavnet ditt til edit-knappen () For å få edit link (). Fordi django bruker metoder som starter med get som aksesser for felt i en modellklasse … så hvis du ikke endrer den, vil django prøve å kalle den metoden på modellklassen din i stedet for på modelladministratorklassen din … som ikke vil fungere fordi Det er ingen slik metode definert på modellklassen din ... uansett, her er hvordan du kunne gjøre det: merk også at jeg har endret funksjonsnavnet ditt til redigeringsknapp () For å få redigeringslink (). Fordi django bruker metoder som starter med get som aksesser for felt i en modellklasse … så hvis du ikke endrer den, vil django prøve å kalle den metoden på modellklassen din i stedet for på modelladministratorklassen din … som ikke vil fungere fordi Det er ingen slik metode definert på modellklassen din ... uansett, her er hvordan du kunne gjøre det: merk også at jeg har endret funksjonsnavnet ditt til redigeringsknapp () For å få redigeringslink (). Fordi django bruker metoder som starter med get som aksesser for felt i en modellklasse … så hvis du ikke endrer den, vil django prøve å kalle den metoden på modellklassen din i stedet for på modelladministratorklassen din … som ikke vil fungere fordi Det er ingen slik metode definert på din modus lClass. .. Uansett, her er hvordan du kan gjøre det: legg også merke til at jeg har angedyourfunctionnameto edi tbuttontogetedi tin k(). Fordi edjangouse-metoder begynner med å få tilgang til feltene i en modellklasse..slik at du ikke endrer det,,django vil prøve og kalle den metoden på modellklassen din i stedet for på din modelladmin-klasse..som ikke fungerer fordi han ikke er en slik metode definert på modellen din som standard.

Hvordan tilpasse Django

1.7

Det finnes ikke noe entydig svar på dette spørsmålet, siden den beste måten å tilpasse Django på vil variere avhengig av dine spesifikke behov. Noen tips om hvordan du tilpasser Django i 1.7 inkluderer imidlertid:

1. Bruk egendefinerte maler og visninger

En måte å tilpasse Django på er å bruke egendefinerte maler og visninger. Dette lar deg lage dine egne maler og visninger som kan brukes til å overstyre eller supplere standardmalene og visningene levert av Django. Dette kan være en fin måte å skreddersy utseendet og følelsen til nettstedet ditt spesifikt for dine egne behov.

2. Bruk tilpassede innstillingsfiler

En annen måte å tilpasse Django på er å bruke tilpassede innstillingsfiler. Disse filene inneholder konfigurasjonsinformasjon om nettstedet ditt, for eksempel hvilke databaser som skal brukes, hvilke URL-er som skal åpnes og så videre. Ved å bruke en egen innstillingsfil for hvert miljø (utvikling, testing, produksjon), kan du enkelt konfigurere Django akkurat slik du vil ha den uten å måtte endre standard innstillingsfil.

3. Bruk tredjeparts biblioteker og plugins

Til slutt, en annen måte å tilpasse Django på er ved å bruke tredjeparts biblioteker og plugins. Dette er stykker programvare som lar deg gjøre ting som ikke er mulig med standardfunksjonaliteten som leveres av Django selv. Du kan for eksempel bruke et bibliotek som gir støtte for datamigrasjoner eller autentiseringsmekanismer. Ved å bruke tredjeparts biblioteker og plugins kan du utvide funksjonaliteten til Django utover det som er tilgjengelig ut av esken

knapper

Knapper er et vanlig element i nettapplikasjoner. De lar brukere samhandle med applikasjonen på forskjellige måter. En knapp kan for eksempel brukes til å sende inn et skjema, logge på eller avslutte søknaden.

Felt

Felt er en kjernekomponent i Django. De brukes til å lagre data i en database. Felt er definert i en modellklasse og kan nås med navn fra visninger og andre moduler. Felt kan også tilordnes til objekter ved å bruke felt()-funksjonen.

Relaterte innlegg:

Legg igjen en kommentar