Vyřešeno: přizpůsobit django admin tlačítko upravit model v poli

Poslední aktualizace: 09/11/2023

Hlavním problémem je, že přizpůsobení tlačítka úpravy modelu správce django v poli může vést k neočekávanému chování.

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 není takový způsob definován ve vašem urmodu elcl ass.,,.V každém případě byste to mohli udělat.: také si všimněte, že jste změnili název své funkce, abyste upravili tlačítko 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 nebude fungovat, protože zde není žádná taková metoda definována ve vaší třídě modelu., každopádně, zde je návod, jak to můžete udělat: také si všimněte, že jsem změnil název vaší funkce na tlačítko upravit () Chcete-li získat odkaz na úpravy (). Protože django používá metody začínající get jako přístupové objekty pro pole v modelové třídě… takže pokud to nezměníte, django zkusí zavolat tuto metodu ve vaší třídě modelu místo ve vaší třídě správce modelu… což nebude fungovat, protože Na vaší třídě modelu není definována žádná taková metoda … každopádně zde je návod, jak byste to mohli udělat: také si všimněte, že jsem změnil název vaší funkce na tlačítko úprav () Chcete-li získat odkaz na úpravy (). Protože django používá metody začínající get jako přístupové objekty pro pole v modelové třídě… takže pokud to nezměníte, django zkusí zavolat tuto metodu ve vaší třídě modelu místo ve vaší třídě správce modelu… což nebude fungovat, protože Na vaší třídě modelu není definována žádná taková metoda … každopádně zde je návod, jak byste to mohli udělat: také si všimněte, že jsem změnil název vaší funkce na tlačítko úprav () Chcete-li získat odkaz na úpravy (). Protože django používá metody začínající get jako přístupové objekty pro pole v modelové třídě… takže pokud to nezměníte, django zkusí zavolat tuto metodu ve vaší třídě modelu místo ve vaší třídě správce modelu… což nebude fungovat, protože Ve vašem režimu lClass není žádná taková metoda definována. .. každopádně, zde je návod, jak byste to mohli udělat: také si všimněte, že se změnil název vaší funkce, aby bylo možné upravit tlačítko pro úpravu k(). Protože edjangousypoužívámetodyzačínajícízískatpřístupypolívetříděmodelu..takže to nezměníte,,django se pokusí a nazvat tuto metodu vaší modelové třídy místo vaší modelové adminclass..která nebude fungovat,protože zde není taková metoda definovaná ve výchozím nastavení vašeho modelu..stejně jako:můžete také udělat. Protože edjango používá metody začínající na getasaccessors of fields v modelové třídě... takže pokud to nezměníte, Django se pokusí zavolat tuto metodu na vaši modelovou třídu místo na vaši modelovou admin třídu... což nebude fungovat, protože zde žádná taková metoda není definována.

Jak přizpůsobit Django

1.7

Na tuto otázku neexistuje žádná univerzální odpověď, protože nejlepší způsob přizpůsobení Django se bude lišit v závislosti na vašich konkrétních potřebách. Některé tipy, jak přizpůsobit Django ve verzi 1.7, však zahrnují:

1. Použijte vlastní šablony a pohledy

Jedním ze způsobů, jak přizpůsobit Django, je použití vlastních šablon a zobrazení. To vám umožní vytvořit si vlastní šablony a pohledy, které lze použít k přepsání nebo doplnění výchozích šablon a pohledů poskytovaných Django. Může to být skvělý způsob, jak upravit vzhled a dojem z vašeho webu speciálně pro vaše vlastní potřeby.

2. Použijte soubory uživatelských nastavení

Dalším způsobem, jak přizpůsobit Django, je použití souborů vlastních nastavení. Tyto soubory obsahují konfigurační informace o vašem webu, například které databáze by se měly používat, které adresy URL by měly být přístupné a tak dále. Použitím samostatného souboru nastavení pro každé prostředí (vývoj, testování, výroba) můžete snadno nakonfigurovat Django přesně tak, jak chcete, aniž byste museli upravovat výchozí soubor nastavení.

3. Používejte knihovny a pluginy třetích stran

Dalším způsobem, jak přizpůsobit Django, je použití knihoven a pluginů třetích stran. Jedná se o části softwaru, které vám umožňují dělat věci, které nejsou možné s výchozí funkcí poskytovanou samotným Django. Můžete například použít knihovnu, která poskytuje podporu pro migraci dat nebo mechanismy ověřování. Pomocí knihoven a pluginů třetích stran můžete rozšířit funkčnost Django nad rámec toho, co je k dispozici po vybalení

Tlačítka

Tlačítka jsou běžným prvkem webových aplikací. Umožňují uživatelům komunikovat s aplikací různými způsoby. Tlačítko lze například použít k odeslání formuláře, přihlášení nebo ukončení aplikace.

Pole

Pole jsou základní součástí Django. Používají se k ukládání dat do databáze. Pole jsou definována ve třídě modelu a lze k nim přistupovat podle názvu z pohledů a dalších modulů. Pole lze také přiřadit objektům pomocí funkce field().

Související příspěvky: