El problema principal és que personalitzar el botó d'edició del model d'administració de django en un camp pot provocar un comportament inesperat.
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 '<a href="/myapp/mymodel/%s">edit</a>' % 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 Defineix el teu mètode elcl.,,.Anywaayhreish owyocouldoit.: també tingues en compte que ha canviat el nom de la teva funció per editar el botógetedi tin k().Perquè s'utilitza el mètode dswithstartin gwithgeasaccess sorforfie lsina, lsinamodelenshod'n't'assessment,'lsinamodelensteady'l'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 no funcionarà perquè aquí no hi ha cap mètode definit a la vostra classe de model., .De totes maneres, aquí és com podeu fer-ho: també tingueu en compte que he canviat el nom de la vostra funció per editar el botó () Per obtenir l'enllaç d'edició (). Com que django utilitza mètodes que comencen per get com a descriptors d'accés per als camps d'una classe de model... així que si no el canvieu, django provarà d'anomenar aquest mètode a la vostra classe de model en lloc de a la vostra classe d'administració de model... cosa que no funcionarà perquè No hi ha cap mètode definit a la vostra classe de model... de totes maneres, aquí és com ho podríeu fer: també tingueu en compte que he canviat el nom de la vostra funció per editar el botó () Per obtenir l'enllaç d'edició (). Com que django utilitza mètodes que comencen per get com a descriptors d'accés per als camps d'una classe de model... així que si no el canvieu, django provarà d'anomenar aquest mètode a la vostra classe de model en lloc de a la vostra classe d'administració de model... cosa que no funcionarà perquè No hi ha cap mètode definit a la vostra classe de model... de totes maneres, aquí és com ho podríeu fer: també tingueu en compte que he canviat el nom de la vostra funció per editar el botó () Per obtenir l'enllaç d'edició (). Com que django utilitza mètodes que comencen per get com a descriptors d'accés per als camps d'una classe de model... així que si no el canvieu, django provarà d'anomenar aquest mètode a la vostra classe de model en lloc de a la vostra classe d'administració de model... cosa que no funcionarà perquè No hi ha aquest mètode definit al vostre mode lClass. .. De totes maneres, aquí és com ho podríeu fer: també tingueu en compte que ha anat el nom de la vostra funció per editar el botó i tin k(). Com que els mètodes que comencen amb els accessoris dels camps de la classe de model, si no el canvieu, jago provarà i trucarà a aquest mètode de la vostra classe de model en comptes de la vostra classe d'administrador de model..que no funcionarà perquè aquí no hi ha aquest mètode definit al vostre model per defecte, també ho tindria en compte. Com que Edjango utilitza mètodes que comencen amb "get" com a accessors de camps a la classe de model... així que si no el canvieu, Django intentarà cridar aquest mètode a la vostra classe de model en lloc de a la vostra classe d'administració de models... cosa que no funcionarà perquè no hi ha cap mètode definit.
Com personalitzar Django
1.7
No hi ha una resposta única a aquesta pregunta, ja que la millor manera de personalitzar Django variarà en funció de les vostres necessitats específiques. Tanmateix, alguns consells sobre com personalitzar Django a 1.7 inclouen:
1. Utilitzeu plantilles i vistes personalitzades
Una manera de personalitzar Django és utilitzant plantilles i vistes personalitzades. Això us permet crear les vostres pròpies plantilles i vistes que es poden utilitzar per substituir o complementar les plantilles i vistes predeterminades proporcionades per Django. Aquesta pot ser una manera fantàstica d'adaptar l'aspecte del vostre lloc web específicament a les vostres necessitats.
2. Utilitzeu fitxers de configuració personalitzats
Una altra manera de personalitzar Django és utilitzar fitxers de configuració personalitzats. Aquests fitxers contenen informació de configuració del vostre lloc web, com ara quines bases de dades s'han d'utilitzar, a quins URL s'ha d'accedir, etc. Mitjançant l'ús d'un fitxer de configuració independent per a cada entorn (desenvolupament, proves, producció), podeu configurar fàcilment Django exactament com vulgueu sense haver de modificar el fitxer de configuració predeterminat.
3. Utilitzeu biblioteques i connectors de tercers
Finalment, una altra manera de personalitzar Django és utilitzant biblioteques i complements de tercers. Es tracta de peces de programari que us permeten fer coses que no són possibles amb la funcionalitat predeterminada proporcionada pel mateix Django. Per exemple, podeu utilitzar una biblioteca que ofereixi suport per a migracions de dades o mecanismes d'autenticació. Mitjançant l'ús de biblioteques i complements de tercers, podeu ampliar la funcionalitat de Django més enllà del que està disponible de manera immediata.
Botons
Els botons són un element comú a les aplicacions web. Permeten als usuaris interactuar amb l'aplicació de diverses maneres. Per exemple, es pot utilitzar un botó per enviar un formulari, iniciar sessió o sortir de l'aplicació.
Els camps
Els camps són un component bàsic de Django. S'utilitzen per emmagatzemar dades en una base de dades. Els camps es defineixen en una classe de model i es pot accedir pel nom des de les vistes i altres mòduls. També es poden assignar camps a objectes mitjançant la funció field().