Asıl sorun, bir alandaki django admin düzenleme modeli düğmesini özelleştirmenin beklenmeyen davranışlara yol açabilmesidir.
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 urmod elcl ass.,,.Anywayhreish owydoit.: ayrıcanotehatihavechangedyourfunctionnametoeditt buttongetedi tin k().Çünkü edjanganmetho dswithstartin gwithgeasaccess sorforfie lsinamodelelass.,,.Soifdondtchan geittryan calllhatmet ho donyourmo delcl assenothenyourmodela minc lasbeofsonra minc lasbeofongeasaccess. 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 çalışmayacak çünkü burada model sınıfınızda tanımlanmış böyle bir yöntem yok ., . her neyse, işte bunu nasıl yapabileceğiniz: ayrıca işlev adınızı düzenleme düğmesi () olarak değiştirdiğime dikkat edin, düzenleme bağlantısını () almak için. Django, bir model Sınıfındaki alanlar için erişimci olarak get ile başlayan yöntemleri kullandığından… bu nedenle, eğer Bunu değiştirmezseniz, Django Bu Yöntemi Model Yönetici Sınıfınız Yerine Model Sınıfınızda Çağıracaktır… ki bu Çalışmaz Çünkü Çalışmaz Model Sınıfınızda Tanımlanmış Böyle Bir Yöntem Yok… Neyse, İşte Bunu Nasıl Yapabileceğiniz: Ayrıca, işlev adınızı düzenleme düğmesi () olarak değiştirdiğime dikkat edin, düzenleme bağlantısını () almak için. Django, bir model Sınıfındaki alanlar için erişimci olarak get ile başlayan yöntemleri kullandığından… bu nedenle, eğer Onu değiştirmezseniz, Django Bu Yöntemi Model Yönetici Sınıfınız Yerine Model Sınıfınızda Çağıracaktır… ki bu Çalışmaz Çünkü Çalışmaz Model Sınıfınızda Tanımlanmış Böyle Bir Yöntem Yok… Neyse, İşte Nasıl Yapabileceğiniz: Ayrıca, işlev adınızı düzenleme düğmesi () olarak değiştirdiğime dikkat edin, düzenleme bağlantısını () almak için. Django, bir model Sınıfındaki alanlar için erişimci olarak get ile başlayan yöntemleri kullandığından… bu nedenle, eğer Onu değiştirmezseniz, Django Bu Yöntemi Model Yönetici Sınıfınız Yerine Model Sınıfınızda Çağıracaktır… ki bu Çalışmaz Çünkü Çalışmaz Modunuzda Tanımlanmış Böyle Bir Yöntem Yok lClass . .. her neyse, İşte Bunu Nasıl Yapabileceğiniz: Ayrıca, işlevadınız öğesini k() öğesini düzenlemek için düzenlediğinize dikkat edin. Çünkü edjangos, getasaccessors of fields a modelclass ile başlayan metotları kullandığından..soif youdontchange,,,,django,deneyin ve bu metodu modelinizinadminclass yerine model sınıfınızda çağıracaktır..hangi işe yaramaz çünkü burada modelinizin varsayılanındatanımlı böyle bir metot yoktur..neyse,işte bunu yapabileceğinizigösteririm. Çünkü edjango, bir model sınıfındaki alanların erişimcilerini alarak başlayan yöntemleri kullanır... bu yüzden onu değiştirmezseniz, django bu yöntemi modeladminsınıfınız yerine model sınıfınızda çağırmaya çalışacaktır... bu da işe yaramayacaktır çünkü böyle bir yöntem tanımlanmamıştır
Django nasıl özelleştirilir
1.7
Django'yu özelleştirmenin en iyi yolu özel ihtiyaçlarınıza bağlı olarak değişeceğinden, bu sorunun her duruma uyan tek bir yanıtı yoktur. Ancak, 1.7'de Django'nun nasıl özelleştirileceğine ilişkin bazı ipuçları şunları içerir:
1. Özel şablonlar ve görünümler kullanın
Django'yu özelleştirmenin bir yolu, özel şablonlar ve görünümler kullanmaktır. Bu, Django tarafından sağlanan varsayılan şablonları ve görünümleri geçersiz kılmak veya tamamlamak için kullanılabilecek kendi şablonlarınızı ve görünümlerinizi oluşturmanıza olanak tanır. Bu, web sitenizin görünümünü ve hissini özellikle kendi ihtiyaçlarınıza göre uyarlamanın harika bir yolu olabilir.
2. Özel ayar dosyalarını kullanın
Django'yu özelleştirmenin başka bir yolu da özel ayar dosyalarını kullanmaktır. Bu dosyalar, hangi veritabanlarının kullanılması gerektiği, hangi URL'lere erişilmesi gerektiği gibi web sitenizle ilgili yapılandırma bilgilerini içerir. Her ortam (geliştirme, test, üretim) için ayrı bir ayar dosyası kullanarak, varsayılan ayarlar dosyasını değiştirmek zorunda kalmadan Django'yu tam olarak istediğiniz şekilde kolayca yapılandırabilirsiniz.
3. Üçüncü taraf kitaplıkları ve eklentileri kullanın
Son olarak, Django'yu özelleştirmenin başka bir yolu da üçüncü taraf kitaplıkları ve eklentileri kullanmaktır. Bunlar, Django tarafından sağlanan varsayılan işlevlerle mümkün olmayan şeyleri yapmanıza izin veren yazılım parçalarıdır. Örneğin, veri geçişleri veya kimlik doğrulama mekanizmaları için destek sağlayan bir kitaplık kullanabilirsiniz. Üçüncü taraf kitaplıkları ve eklentileri kullanarak, Django'nun işlevselliğini kutudan çıkanın ötesine genişletebilirsiniz.
Düğmeler
Düğmeler, web uygulamalarında yaygın olarak kullanılan bir öğedir. Kullanıcıların uygulama ile çeşitli şekillerde etkileşime girmesine izin verirler. Örneğin, bir form göndermek, oturum açmak veya uygulamadan çıkmak için bir düğme kullanılabilir.
Alanlar
Alanlar, Django'nun temel bir bileşenidir. Verileri bir veritabanında depolamak için kullanılırlar. Alanlar bir model sınıfında tanımlanır ve görünümlerden ve diğer modüllerden adlarıyla erişilebilir. Alanlar ayrıca field() işlevi kullanılarak nesnelere atanabilir.