Riješeno: prilagodite django administratorski gumb za uređivanje modela u polju

Zadnje ažuriranje: 09/11/2023

Glavni je problem što prilagodba django administratorskog gumba za uređivanje modela u polju može dovesti do neočekivanog ponašanja.

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.: alsonotehatihavechangedyourfunctionnametoeditt buttongetedi tin k().Becaus edjanganusesmetho dswithstartin gwithgeasacces sorforfie lsinamodelelass.,,.Soifdondtchan geittryan calllhatmet ho donyourmo delcl assinsteadofonyourmodela minc lassthenwillnotbea 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 neće raditi jer ovdje nije definirana takva metoda na vašoj klasi modela., .u svakom slučaju, evo kako to možete učiniti: također imajte na umu da sam promijenio naziv vaše funkcije u gumb za uređivanje () Da biste dobili vezu za uređivanje (). Budući da django koristi metode koje počinju s get kao pristupnike za polja u klasi modela ... pa ako je ne promijenite, django će pokušati pozvati tu metodu na vašu klasu modela umjesto na vašu klasu administratora modela ... što neće raditi jer Ne postoji takva metoda definirana na vašoj klasi modela ... u svakom slučaju, evo kako biste to mogli učiniti: također imajte na umu da sam promijenio naziv vaše funkcije u gumb za uređivanje () Da biste dobili vezu za uređivanje (). Budući da django koristi metode koje počinju s get kao pristupnike za polja u klasi modela ... pa ako je ne promijenite, django će pokušati pozvati tu metodu na vašu klasu modela umjesto na vašu klasu administratora modela ... što neće raditi jer Ne postoji takva metoda definirana na vašoj klasi modela ... u svakom slučaju, evo kako biste to mogli učiniti: također imajte na umu da sam promijenio naziv vaše funkcije u gumb za uređivanje () Da biste dobili vezu za uređivanje (). Budući da django koristi metode koje počinju s get kao pristupnike za polja u klasi modela ... pa ako je ne promijenite, django će pokušati pozvati tu metodu na vašu klasu modela umjesto na vašu klasu administratora modela ... što neće raditi jer Ne postoji takva metoda definirana na vašem načinu lClass. .. u svakom slučaju, evo kako biste to mogli učiniti: također imajte na umu da ste dodali naziv svoje funkcije da biste uredili tbuttontogetedi tin k(). Becaus edjangousesmethodsstartingwithgetasaccessorsoffieldsinamodelclass..soifyoudontchangeit,,djangowilltryandcallthatmethodonyourmodelclassinsteadofonyourmodeladminclass..whichwontworkbecausehereisnosuchmethoddefinedonyourmodeldefault..anyway,,hereishowyoucoulddoit.: also note th ati hav ech angedyourfunctionnameto edi tbuttontogetedi tin k(). Budući da edjango koristi metode koje počinju s pristupnicima polja u klasi modela... pa ako to ne promijenite, django će pokušati pozvati tu metodu na vašoj klasi modela umjesto na vašoj admin klasi modela... što neće raditi jer takva metoda nije definirana.

Kako prilagoditi Django

1.7

Ne postoji jednoznačan odgovor na ovo pitanje, budući da će najbolji način za prilagodbu Djanga varirati ovisno o vašim specifičnim potrebama. Međutim, neki savjeti o tome kako prilagoditi Django u 1.7 uključuju:

1. Koristite prilagođene predloške i poglede

Jedan od načina da prilagodite Django je korištenje prilagođenih predložaka i pogleda. To vam omogućuje stvaranje vlastitih predložaka i prikaza koji se mogu koristiti za nadjačavanje ili dopunu zadanih predložaka i pogleda koje nudi Django. To može biti sjajan način da prilagodite izgled i dojam svoje web stranice posebno za vlastite potrebe.

2. Koristite datoteke prilagođenih postavki

Drugi način za prilagodbu Djanga je korištenje prilagođenih datoteka postavki. Ove datoteke sadrže informacije o konfiguraciji vaše web stranice, kao što su baze podataka koje bi se trebale koristiti, kojim bi URL-ovima trebalo pristupiti i tako dalje. Korištenjem zasebne datoteke postavki za svako okruženje (razvoj, testiranje, proizvodnja), možete jednostavno konfigurirati Django točno onako kako želite, a da ne morate mijenjati datoteku zadanih postavki.

3. Koristite biblioteke i dodatke trećih strana

Konačno, još jedan način za prilagodbu Djanga je korištenje biblioteka i dodataka trećih strana. To su dijelovi softvera koji vam omogućuju da radite stvari koje nisu moguće sa zadanom funkcijom koju pruža sam Django. Na primjer, možete koristiti biblioteku koja pruža podršku za migracije podataka ili mehanizme provjere autentičnosti. Korištenjem biblioteka i dodataka trećih strana, možete proširiti funkcionalnost Djanga izvan onoga što je dostupno izvan kutije

tipke

Gumbi su čest element u web aplikacijama. Korisnicima omogućuju interakciju s aplikacijom na različite načine. Na primjer, gumb se može koristiti za slanje obrasca, prijavu ili izlaz iz aplikacije.

Polja

Polja su ključna komponenta Djanga. Koriste se za pohranu podataka u bazu podataka. Polja su definirana u klasi modela i može im se pristupiti imenom iz prikaza i drugih modula. Polja se također mogu dodijeliti objektima pomoću funkcije field().

Povezani postovi: