Решено: персонализиране на django администраторски бутон за редактиране на модел в полето

Последна актуализация: 09/11/2023

Основният проблем е, че персонализирането на бутона за редактиране на модела за администратор на django в поле може да доведе до неочаквано поведение.

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 няма да работи, защото тук няма такъв метод, дефиниран във вашия клас модел., .както и да е, ето как бихте могли да го направите: също така имайте предвид, че промених името на вашата функция на бутон за редактиране () За да получите връзка за редактиране (). Тъй като django използва методи, започващи с get, като инструменти за достъп за полета в моделен клас ... така че ако не го промените, django ще се опита да извика този метод на вашия моделен клас, вместо на вашия моделен администраторски клас ... което няма да работи, защото Няма такъв метод, дефиниран във вашия моделен клас ... както и да е, ето как можете да го направите: също така имайте предвид, че промених името на вашата функция на бутон за редактиране (), за да получите връзка за редактиране (). Тъй като django използва методи, започващи с get, като инструменти за достъп за полета в моделен клас ... така че ако не го промените, django ще се опита да извика този метод на вашия моделен клас, вместо на вашия моделен администраторски клас ... което няма да работи, защото Няма такъв метод, дефиниран във вашия моделен клас ... както и да е, ето как можете да го направите: също така имайте предвид, че промених името на вашата функция на бутон за редактиране (), за да получите връзка за редактиране (). Тъй като django използва методи, започващи с get, като инструменти за достъп за полета в моделен клас ... така че ако не го промените, django ще се опита да извика този метод на вашия моделен клас, вместо на вашия моделен администраторски клас ... което няма да работи, защото Няма дефиниран такъв метод във вашия режим lClass. .. както и да е, ето как можете да го направите: също така имайте предвид, че сте променили името на вашата функция, за да редактирате tbuttontogetedi tin k(). Becaus edjangousesmethodsstartingwithgetasaccessorsoffieldsinamodelclass..soifyoudontchangeit,,djangowilltryandcallthatmethodonyourmodelclassinsteadofonyourmodeladminclass..whichwontworkbecausehereisnosuchmethoddefinedonyourmodeldefault..anyway,,hereishowyoucoulddoit.: also note th ati hav ech angedyourfunctionnameto edi tbuttontogetedi tin k().

Как да персонализирате Django

1.7

Няма универсален отговор на този въпрос, тъй като най-добрият начин за персонализиране на Django ще варира в зависимост от вашите специфични нужди. Въпреки това някои съвети как да персонализирате Django в 1.7 включват:

1. Използвайте персонализирани шаблони и изгледи

Един от начините за персонализиране на Django е чрез използване на персонализирани шаблони и изгледи. Това ви позволява да създавате свои собствени шаблони и изгледи, които могат да се използват за заместване или допълване на шаблоните и изгледите по подразбиране, предоставени от Django. Това може да бъде чудесен начин да приспособите външния вид и усещането на вашия уебсайт специално за вашите собствени нужди.

2. Използвайте персонализирани файлове с настройки

Друг начин за персонализиране на Django е чрез използване на персонализирани файлове с настройки. Тези файлове съдържат конфигурационна информация за вашия уебсайт, като например кои бази данни трябва да се използват, кои URL адреси трябва да бъдат достъпни и т.н. Като използвате отделен файл с настройки за всяка среда (разработка, тестване, производство), можете лесно да конфигурирате Django точно както искате, без да се налага да променяте файла с настройки по подразбиране.

3. Използвайте библиотеки и плъгини на трети страни

И накрая, друг начин за персонализиране на Django е чрез използване на библиотеки и плъгини на трети страни. Това са части от софтуер, които ви позволяват да правите неща, които не са възможни с функционалността по подразбиране, предоставена от самия Django. Например, можете да използвате библиотека, която осигурява поддръжка за мигриране на данни или механизми за удостоверяване. Чрез използването на библиотеки и плъгини на трети страни можете да разширите функционалността на Django извън това, което е налично извън кутията

Копчета

Бутоните са често срещан елемент в уеб приложенията. Те позволяват на потребителите да взаимодействат с приложението по различни начини. Например, бутон може да се използва за изпращане на формуляр, влизане или излизане от приложението.

Полетата

Полетата са основен компонент на Django. Те се използват за съхраняване на данни в база данни. Полетата са дефинирани в моделен клас и могат да бъдат достъпни по име от изгледи и други модули. Полетата могат също да бъдат присвоени на обекти с помощта на функцията field().

Подобни публикации:

Оставете коментар