हल: क्षेत्र में django व्यवस्थापक संपादित मॉडल बटन को अनुकूलित करें

मुख्य समस्या यह है कि एक क्षेत्र में 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="/hi/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 वैसे भी हरेश ओवियो कर सकते हैं। 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 एक मॉडल क्लास में फ़ील्ड्स के लिए एक्सेसर्स के रूप में प्राप्त करने के साथ शुरू होने वाली विधियों का उपयोग करता है ... इसलिए यदि आप इसे नहीं बदलते हैं, तो django आपके मॉडल एडमिन क्लास के बजाय आपके मॉडल क्लास पर उस विधि को आजमाएगा और कॉल करेगा ... जो काम नहीं करेगा क्योंकि आपके मॉडल वर्ग पर ऐसी कोई विधि परिभाषित नहीं है ... वैसे भी, यहां बताया गया है कि आप इसे कैसे कर सकते हैं: यह भी ध्यान दें कि मैंने आपके फ़ंक्शन का नाम संपादित करने के लिए बटन बदल दिया है () संपादन लिंक प्राप्त करने के लिए ()। क्योंकि django एक मॉडल क्लास में फ़ील्ड्स के लिए एक्सेसर्स के रूप में प्राप्त करने के साथ शुरू होने वाली विधियों का उपयोग करता है ... इसलिए यदि आप इसे नहीं बदलते हैं, तो django आपके मॉडल एडमिन क्लास के बजाय आपके मॉडल क्लास पर उस विधि को आजमाएगा और कॉल करेगा ... जो काम नहीं करेगा क्योंकि आपके मॉडल वर्ग पर ऐसी कोई विधि परिभाषित नहीं है ... वैसे भी, यहां बताया गया है कि आप इसे कैसे कर सकते हैं: यह भी ध्यान दें कि मैंने आपके फ़ंक्शन का नाम संपादित करने के लिए बटन बदल दिया है () संपादन लिंक प्राप्त करने के लिए ()। क्योंकि django एक मॉडल क्लास में फ़ील्ड्स के लिए एक्सेसर्स के रूप में प्राप्त करने के साथ शुरू होने वाली विधियों का उपयोग करता है ... इसलिए यदि आप इसे नहीं बदलते हैं, तो django आपके मॉडल एडमिन क्लास के बजाय आपके मॉडल क्लास पर उस विधि को आजमाएगा और कॉल करेगा ... जो काम नहीं करेगा क्योंकि आपके मोड lClass पर ऐसी कोई विधि परिभाषित नहीं है। .. वैसे भी, यहां बताया गया है कि आप इसे कैसे कर सकते हैं: यह भी ध्यान दें कि एटी हैव ईच एंजेड योरफंक्शननाम टू एडी टीबटन टोगेटीडी टिन के ()। क्योंकि edjangoes तरीके start with getas accessors offieldsinamodel class..इसलिए यदि आप इसे नहीं बदलते हैं, तो django कोशिश करेगा और उस विधि को अपने मॉडल वर्ग के बजाय अपने मॉडल वर्ग पर कॉल करेगा..जो काम नहीं करेगा क्योंकि यहां आपके मॉडलडिफ़ॉल्ट पर ऐसी कोई विधि परिभाषित नहीं है..वैसे भी, यहां देखें कि आप ऐसा कर सकते हैं।

Django को कैसे अनुकूलित करें

1.7

इस प्रश्न का कोई एक आकार-फिट-सभी उत्तर नहीं है, क्योंकि Django को अनुकूलित करने का सबसे अच्छा तरीका आपकी विशिष्ट आवश्यकताओं के आधार पर अलग-अलग होगा। हालाँकि, 1.7 में Django को अनुकूलित करने के कुछ सुझावों में शामिल हैं:

1. कस्टम टेम्प्लेट और दृश्यों का उपयोग करें

Django को अनुकूलित करने का एक तरीका कस्टम टेम्प्लेट और विचारों का उपयोग करना है। यह आपको अपने स्वयं के टेम्प्लेट और दृश्य बनाने की अनुमति देता है जिनका उपयोग Django द्वारा प्रदान किए गए डिफ़ॉल्ट टेम्प्लेट और विचारों को ओवरराइड या पूरक करने के लिए किया जा सकता है। यह विशेष रूप से आपकी स्वयं की आवश्यकताओं के लिए आपकी वेबसाइट के रंगरूप को अनुकूलित करने का एक शानदार तरीका हो सकता है।

2. कस्टम सेटिंग फ़ाइलों का उपयोग करें

Django को अनुकूलित करने का दूसरा तरीका कस्टम सेटिंग्स फ़ाइलों का उपयोग करना है। इन फ़ाइलों में आपकी वेबसाइट के बारे में कॉन्फ़िगरेशन जानकारी होती है, जैसे कि कौन से डेटाबेस का उपयोग किया जाना चाहिए, कौन से URL एक्सेस किए जाने चाहिए, इत्यादि। प्रत्येक वातावरण (विकास, परीक्षण, उत्पादन) के लिए एक अलग सेटिंग्स फ़ाइल का उपयोग करके, आप डिफ़ॉल्ट सेटिंग्स फ़ाइल को संशोधित किए बिना Django को ठीक उसी तरह से कॉन्फ़िगर कर सकते हैं जिस तरह से आप इसे चाहते हैं।

3. तीसरे पक्ष के पुस्तकालयों और प्लगइन्स का प्रयोग करें

अंत में, Django को अनुकूलित करने का दूसरा तरीका तृतीय-पक्ष पुस्तकालयों और प्लगइन्स का उपयोग करना है। ये सॉफ़्टवेयर के टुकड़े हैं जो आपको उन चीजों को करने की अनुमति देते हैं जो स्वयं Django द्वारा प्रदान की गई डिफ़ॉल्ट कार्यक्षमता के साथ संभव नहीं हैं। उदाहरण के लिए, आप एक पुस्तकालय का उपयोग कर सकते हैं जो डेटा माइग्रेशन या प्रमाणीकरण तंत्र के लिए समर्थन प्रदान करता है। तीसरे पक्ष के पुस्तकालयों और प्लगइन्स का उपयोग करके, आप बॉक्स से बाहर उपलब्ध होने से परे Django की कार्यक्षमता का विस्तार कर सकते हैं

बटन

वेब एप्लिकेशन में बटन एक सामान्य तत्व हैं। वे उपयोगकर्ताओं को एप्लिकेशन के साथ विभिन्न तरीकों से इंटरैक्ट करने की अनुमति देते हैं। उदाहरण के लिए, एक बटन का उपयोग फॉर्म जमा करने, लॉग इन करने या एप्लिकेशन से बाहर निकलने के लिए किया जा सकता है।

फ़ील्ड

फील्ड्स Django का एक मुख्य घटक है। इनका उपयोग डेटाबेस में डेटा को स्टोर करने के लिए किया जाता है। फ़ील्ड्स को एक मॉडल वर्ग में परिभाषित किया गया है और इसे विचारों और अन्य मॉड्यूल से नाम से एक्सेस किया जा सकता है। फ़ील्ड() फ़ंक्शन का उपयोग करके फ़ील्ड्स को ऑब्जेक्ट्स को भी असाइन किया जा सकता है।

संबंधित पोस्ट:

एक टिप्पणी छोड़ दो