Основная проблема заключается в том, что настройка кнопки редактирования модели администратора 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 '<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 Вы можете это сделать. Также обратите внимание на то, что вы изменили название вашей функции на кнопку редактирования, нажмите кнопку 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 не будет работать, потому что в вашем классе модели такой метод не определен. В любом случае, вот как вы можете это сделать: также обратите внимание, что я изменил имя вашей функции на кнопку редактирования (), чтобы получить ссылку на редактирование (). Поскольку django использует методы, начинающиеся с get, в качестве средств доступа к полям в классе модели… поэтому, если вы не измените его, django попытается вызвать этот метод в классе вашей модели, а не в классе администратора вашей модели… что не сработает, потому что В вашем классе модели не определен такой метод … во всяком случае, вот как вы могли бы это сделать: также обратите внимание, что я изменил имя вашей функции на кнопку редактирования (), чтобы получить ссылку редактирования (). Поскольку django использует методы, начинающиеся с get, в качестве средств доступа к полям в классе модели… поэтому, если вы не измените его, django попытается вызвать этот метод в классе вашей модели, а не в классе администратора вашей модели… что не сработает, потому что В вашем классе модели не определен такой метод … во всяком случае, вот как вы могли бы это сделать: также обратите внимание, что я изменил имя вашей функции на кнопку редактирования (), чтобы получить ссылку редактирования (). Поскольку django использует методы, начинающиеся с get, в качестве средств доступа к полям в классе модели… поэтому, если вы не измените его, django попытается вызвать этот метод в классе вашей модели, а не в классе администратора вашей модели… что не сработает, потому что В вашем режиме lClass такой метод не определен. .. в любом случае, вот как вы можете это сделать: также обратите внимание, что вы изменили имя вашей функции, чтобы изменить кнопку редактирования, чтобы получить tin k(). Поскольку edjango использует методы, начиная с get в качестве доступа к полям в классе модели. Поскольку edjango использует методы, начинающиеся с get в качестве методов доступа к полям в классе модели, то, если вы не измените его, django попробует вызвать этот метод в классе модели вместо метода администрирования класса модели, что не сработает, потому что здесь не определен такой метод.
Как настроить Джанго
1.7
На этот вопрос нет универсального ответа, так как лучший способ настройки Django зависит от ваших конкретных потребностей. Однако некоторые советы по настройке Django в версии 1.7 включают в себя:
1. Используйте собственные шаблоны и представления
Одним из способов настройки Django является использование пользовательских шаблонов и представлений. Это позволяет вам создавать собственные шаблоны и представления, которые можно использовать для переопределения или дополнения шаблонов и представлений по умолчанию, предоставляемых Django. Это может быть отличным способом адаптировать внешний вид вашего веб-сайта специально для ваших нужд.
2. Используйте файлы пользовательских настроек
Другой способ настроить Django — использовать пользовательские файлы настроек. Эти файлы содержат информацию о конфигурации вашего веб-сайта, например, какие базы данных следует использовать, к каким URL-адресам следует обращаться и т. д. Используя отдельный файл настроек для каждой среды (разработка, тестирование, производство), вы можете легко настроить Django именно так, как вам нужно, без необходимости изменять файл настроек по умолчанию.
3. Используйте сторонние библиотеки и плагины
Наконец, еще один способ настроить Django — использовать сторонние библиотеки и плагины. Это части программного обеспечения, которые позволяют вам делать то, что невозможно с функциями по умолчанию, предоставляемыми самим Django. Например, вы можете использовать библиотеку, обеспечивающую поддержку переноса данных или механизмов проверки подлинности. Используя сторонние библиотеки и плагины, вы можете расширить функциональность Django за пределы того, что доступно «из коробки».
Кнопки
Кнопки являются распространенным элементом веб-приложений. Они позволяют пользователям взаимодействовать с приложением различными способами. Например, кнопку можно использовать для отправки формы, входа в систему или выхода из приложения.
Поля
Поля являются основным компонентом Django. Они используются для хранения данных в базе данных. Поля определяются в классе модели и могут быть доступны по имени из представлений и других модулей. Поля также можно назначать объектам с помощью функции field().