Solved: i-customize ang django admin edit model button sa field

Ang pangunahing problema ay ang pag-customize ng django admin edit model button sa isang field ay maaaring humantong sa hindi inaasahang pag-uugali.

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="/tl/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.,. 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 hindi gagana dahil walang ganitong paraan ang tinukoy sa klase ng iyong modelo., .anyway, narito kung paano mo ito magagawa: tandaan din na binago ko ang iyong function na pangalan para i-edit ang button () Upang makakuha ng link sa pag-edit (). Dahil ang django ay gumagamit ng mga pamamaraan na nagsisimula sa get bilang mga accessor para sa mga field sa isang modelong Klase … kaya kung hindi mo ito babaguhin, ang django ay Susubukan At Tatawagin ang Paraang Iyon Sa Iyong Klase ng Modelo Sa halip na Sa Iyong Klase ng Admin ng Modelo … na Hindi Gagana Dahil Walang Ganitong Paraan na Tinukoy sa Iyong Klase ng Modelo … gayon pa man, Narito Kung Paano Mo Ito Magagawa: tandaan din na binago ko ang iyong function na pangalan upang i-edit ang pindutan () Upang makakuha ng link sa pag-edit (). Dahil ang django ay gumagamit ng mga pamamaraan na nagsisimula sa get bilang mga accessor para sa mga field sa isang modelong Klase … kaya kung hindi mo ito babaguhin, ang django ay Susubukan At Tatawagin ang Paraang Iyon Sa Iyong Klase ng Modelo Sa halip na Sa Iyong Klase ng Admin ng Modelo … na Hindi Gagana Dahil Walang Ganitong Paraan na Tinukoy sa Iyong Klase ng Modelo … gayon pa man, Narito Kung Paano Mo Ito Magagawa: tandaan din na binago ko ang iyong function na pangalan upang i-edit ang pindutan () Upang makakuha ng link sa pag-edit (). Dahil ang django ay gumagamit ng mga pamamaraan na nagsisimula sa get bilang mga accessor para sa mga field sa isang modelong Klase … kaya kung hindi mo ito babaguhin, ang django ay Susubukan At Tatawagin ang Paraang Iyon Sa Iyong Klase ng Modelo Sa halip na Sa Iyong Klase ng Admin ng Modelo … na Hindi Gagana Dahil Walang Ganitong Paraang Tinukoy sa Iyong Mode lClass . .. gayon pa man , Narito Kung Paano Mo Ito Magagawa : tandaan din na mayroon itong itinalagang pangalan sa iyong pag-andar sa edi tbuttontogetedi tin k(). Dahil ang mga edjangous na pamamaraan ay nagsisimula sa pagkuha ng mga accessorsoffieldsinamodelclass..para hindi mo ito palitan,,si django ay susubukan at tatawagin na paraan ng iyong modeloclasssa halip na ang iyong modeloadminclass..na kung saan ay hindi gagana dahil dito ay hindi tulad ngmethoddefinedonyourmodeldefault..anyway,,dito ay ipapakita sa iyo:butynote din.

Paano i-customize ang Django

1.7

Walang one-size-fits-all na sagot sa tanong na ito, dahil ang pinakamahusay na paraan upang i-customize ang Django ay mag-iiba depende sa iyong mga partikular na pangangailangan. Gayunpaman, ang ilang mga tip sa kung paano i-customize ang Django sa 1.7 ay kinabibilangan ng:

1. Gumamit ng mga custom na template at view

Ang isang paraan upang i-customize ang Django ay sa pamamagitan ng paggamit ng mga custom na template at view. Binibigyang-daan ka nitong lumikha ng sarili mong mga template at view na maaaring magamit upang i-override o dagdagan ang mga default na template at view na ibinigay ng Django. Maaari itong maging isang mahusay na paraan upang maiangkop ang hitsura at pakiramdam ng iyong website para sa sarili mong mga pangangailangan.

2. Gumamit ng mga custom na setting ng mga file

Ang isa pang paraan upang i-customize ang Django ay sa pamamagitan ng paggamit ng mga custom na setting ng mga file. Ang mga file na ito ay naglalaman ng impormasyon sa pagsasaayos tungkol sa iyong website, tulad ng kung aling mga database ang dapat gamitin, kung aling mga URL ang dapat ma-access, at iba pa. Sa pamamagitan ng paggamit ng isang hiwalay na file ng mga setting para sa bawat kapaligiran (pag-unlad, pagsubok, produksyon), madali mong mai-configure ang Django nang eksakto sa paraang gusto mo nang hindi kinakailangang baguhin ang default na file ng mga setting.

3. Gumamit ng mga third-party na library at plugin

Sa wakas, ang isa pang paraan upang i-customize ang Django ay sa pamamagitan ng paggamit ng mga third-party na library at plugin. Ito ay mga piraso ng software na nagbibigay-daan sa iyong gumawa ng mga bagay na hindi posible sa default na pagpapaandar na ibinigay mismo ng Django. Halimbawa, maaari kang gumamit ng library na nagbibigay ng suporta para sa paglilipat ng data o mga mekanismo ng pagpapatunay. Sa pamamagitan ng paggamit ng mga third-party na aklatan at plugin, maaari mong palawigin ang functionality ng Django nang higit pa sa kung ano ang available out of the box

Mga Pindutan

Ang mga pindutan ay isang karaniwang elemento sa mga web application. Pinapayagan nila ang mga user na makipag-ugnayan sa application sa iba't ibang paraan. Halimbawa, ang isang pindutan ay maaaring gamitin upang magsumite ng isang form, mag-log in, o lumabas sa aplikasyon.

Mga Patlang

Ang mga patlang ay isang pangunahing bahagi ng Django. Ginagamit ang mga ito upang mag-imbak ng data sa isang database. Ang mga patlang ay tinukoy sa isang klase ng modelo at maaaring ma-access sa pamamagitan ng pangalan mula sa mga view at iba pang mga module. Ang mga field ay maaari ding italaga sa mga bagay gamit ang field() function.

Kaugnay na mga post:

Mag-iwan ng komento