ઉકેલી: ફીલ્ડમાં ડીજેંગો એડમિન એડિટ મોડલ બટનને કસ્ટમાઇઝ કરો

મુખ્ય સમસ્યા એ છે કે ફીલ્ડમાં ડીજેંગો એડમિન એડિટ મોડલ બટનને કસ્ટમાઇઝ કરવાથી અનપેક્ષિત વર્તન થઈ શકે છે.

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="/gu/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 કામ કરશે નહીં કારણ કે અહીં તમારા મોડેલ ક્લાસ પર આવી કોઈ પદ્ધતિ વ્યાખ્યાયિત નથી. કારણ કે ડીજેંગો મોડેલ ક્લાસમાં ફીલ્ડ્સ માટે એક્સેસર્સ તરીકે ગેટથી શરૂ થતી પદ્ધતિઓનો ઉપયોગ કરે છે … તેથી જો તમે તેને બદલશો નહીં, તો જેંગો તમારા મોડલ એડમિન ક્લાસને બદલે તમારા મોડેલ ક્લાસ પર તે પદ્ધતિનો પ્રયાસ કરશે અને કૉલ કરશે ... જે કામ કરશે નહીં કારણ કે તમારા મોડલ ક્લાસ પર આવી કોઈ પદ્ધતિ વ્યાખ્યાયિત નથી ... કોઈપણ રીતે, તમે તે કેવી રીતે કરી શકો તે અહીં છે: એ પણ નોંધો કે મેં તમારા ફંક્શનનું નામ એડિટ બટન () એડિટ લિંક મેળવવા માટે () માં બદલ્યું છે. કારણ કે ડીજેંગો મોડેલ ક્લાસમાં ફીલ્ડ્સ માટે એક્સેસર્સ તરીકે ગેટથી શરૂ થતી પદ્ધતિઓનો ઉપયોગ કરે છે … તેથી જો તમે તેને બદલશો નહીં, તો જેંગો તમારા મોડલ એડમિન ક્લાસને બદલે તમારા મોડેલ ક્લાસ પર તે પદ્ધતિનો પ્રયાસ કરશે અને કૉલ કરશે ... જે કામ કરશે નહીં કારણ કે તમારા મોડલ ક્લાસ પર આવી કોઈ પદ્ધતિ વ્યાખ્યાયિત નથી ... કોઈપણ રીતે, તમે તે કેવી રીતે કરી શકો તે અહીં છે: એ પણ નોંધો કે મેં તમારા ફંક્શનનું નામ એડિટ બટન () એડિટ લિંક મેળવવા માટે () માં બદલ્યું છે. કારણ કે ડીજેંગો મોડેલ ક્લાસમાં ફીલ્ડ્સ માટે એક્સેસર્સ તરીકે ગેટથી શરૂ થતી પદ્ધતિઓનો ઉપયોગ કરે છે … તેથી જો તમે તેને બદલશો નહીં, તો જેંગો તમારા મોડલ એડમિન ક્લાસને બદલે તમારા મોડેલ ક્લાસ પર તે પદ્ધતિનો પ્રયાસ કરશે અને કૉલ કરશે ... જે કામ કરશે નહીં કારણ કે તમારા મોડ lClass પર આવી કોઈ પદ્ધતિ વ્યાખ્યાયિત નથી. .. કોઈપણ રીતે, તમે તે કેવી રીતે કરી શકો તે અહીં છે: એ પણ નોંધો કે ati hav ech angedyour functionnameto edi tbuttontogetedi tin k(). Becaus edjangousesmethodsstartingwithgetasaccessorsoffieldsinamodelclass..soifyoudontchangeit,,djangowilltryandcallthatmethodonyourmodelclassinsteadofonyourmodeladminclass..whichwontworkbecausehereisnosuchmethoddefinedonyourmodeldefault..anyway,,hereishowyoucoulddoit.: also note th ati hav ech angedyourfunctionnameto edi tbuttontogetedi tin k().

જેંગોને કેવી રીતે કસ્ટમાઇઝ કરવું

1.7

આ પ્રશ્નનો કોઈ એક-કદ-ફીટ-બધો જવાબ નથી, કારણ કે Djangoને કસ્ટમાઇઝ કરવાની શ્રેષ્ઠ રીત તમારી ચોક્કસ જરૂરિયાતોને આધારે બદલાશે. જો કે, 1.7 માં જેંગોને કેવી રીતે કસ્ટમાઇઝ કરવું તે અંગેની કેટલીક ટીપ્સમાં શામેલ છે:

1. કસ્ટમ નમૂનાઓ અને દૃશ્યોનો ઉપયોગ કરો

જેંગોને કસ્ટમાઇઝ કરવાની એક રીત છે કસ્ટમ નમૂનાઓ અને દૃશ્યોનો ઉપયોગ કરીને. આ તમને તમારા પોતાના નમૂનાઓ અને દૃશ્યો બનાવવાની મંજૂરી આપે છે જેનો ઉપયોગ Django દ્વારા પ્રદાન કરવામાં આવેલા ડિફૉલ્ટ નમૂનાઓ અને દૃશ્યોને ઓવરરાઇડ કરવા અથવા પૂરક કરવા માટે થઈ શકે છે. ખાસ કરીને તમારી પોતાની જરૂરિયાતો માટે તમારી વેબસાઇટના દેખાવ અને અનુભૂતિને અનુરૂપ બનાવવાની આ એક સરસ રીત હોઈ શકે છે.

2. કસ્ટમ સેટિંગ્સ ફાઇલોનો ઉપયોગ કરો

જેંગોને કસ્ટમાઇઝ કરવાની બીજી રીત કસ્ટમ સેટિંગ્સ ફાઇલોનો ઉપયોગ કરીને છે. આ ફાઇલોમાં તમારી વેબસાઇટ વિશે રૂપરેખાંકન માહિતી શામેલ છે, જેમ કે કયા ડેટાબેસેસનો ઉપયોગ કરવો જોઈએ, કયા URL ને ઍક્સેસ કરવા જોઈએ, વગેરે. દરેક પર્યાવરણ (વિકાસ, પરીક્ષણ, ઉત્પાદન) માટે અલગ સેટિંગ્સ ફાઇલનો ઉપયોગ કરીને, તમે ડિફૉલ્ટ સેટિંગ્સ ફાઇલમાં ફેરફાર કર્યા વિના, તમે જે રીતે ઇચ્છો છો તે રીતે તમે સરળતાથી Djangoને ગોઠવી શકો છો.

3. તૃતીય-પક્ષ પુસ્તકાલયો અને પ્લગિન્સનો ઉપયોગ કરો

છેલ્લે, જેન્ગોને કસ્ટમાઇઝ કરવાની બીજી રીત તૃતીય-પક્ષ લાઇબ્રેરીઓ અને પ્લગઇન્સનો ઉપયોગ કરીને છે. આ સૉફ્ટવેરના ટુકડાઓ છે જે તમને એવી વસ્તુઓ કરવાની મંજૂરી આપે છે જે Django દ્વારા જ પ્રદાન કરવામાં આવેલી ડિફૉલ્ટ કાર્યક્ષમતા સાથે શક્ય નથી. ઉદાહરણ તરીકે, તમે લાઇબ્રેરીનો ઉપયોગ કરી શકો છો જે ડેટા સ્થાનાંતરણ અથવા પ્રમાણીકરણ પદ્ધતિઓ માટે સપોર્ટ પ્રદાન કરે છે. તૃતીય-પક્ષ લાઇબ્રેરીઓ અને પ્લગિન્સનો ઉપયોગ કરીને, તમે જેંગોની કાર્યક્ષમતાને બૉક્સની બહાર જે ઉપલબ્ધ છે તેનાથી આગળ વધારી શકો છો.

બટનો

વેબ એપ્લિકેશન્સમાં બટનો એક સામાન્ય તત્વ છે. તેઓ વપરાશકર્તાઓને વિવિધ રીતે એપ્લિકેશન સાથે ક્રિયાપ્રતિક્રિયા કરવાની મંજૂરી આપે છે. ઉદાહરણ તરીકે, ફોર્મ સબમિટ કરવા, લૉગ ઇન કરવા અથવા એપ્લિકેશનમાંથી બહાર નીકળવા માટે બટનનો ઉપયોગ કરી શકાય છે.

ક્ષેત્રો

ક્ષેત્રો Django નું મુખ્ય ઘટક છે. તેનો ઉપયોગ ડેટાબેઝમાં ડેટા સ્ટોર કરવા માટે થાય છે. ક્ષેત્રો એક મોડેલ વર્ગમાં વ્યાખ્યાયિત કરવામાં આવે છે અને દૃશ્યો અને અન્ય મોડ્યુલોમાંથી નામ દ્વારા ઍક્સેસ કરી શકાય છે. ફિલ્ડ() ફંક્શનનો ઉપયોગ કરીને ઓબ્જેક્ટને ફીલ્ડ્સ પણ અસાઇન કરી શકાય છે.

સંબંધિત પોસ્ટ્સ:

પ્રતિક્રિયા આપો