2011-03-16 9 views
10

मेरे पास Django के व्यवस्थापक में एक मॉडल सामने आया है, जो "उपयोगकर्ता" फ़ील्ड दिखाने के लिए ModelAdmin की readonly_fields सूची का उपयोग करता है, जो Django के उपयोगकर्ता मॉडल से जुड़ी फोरीग्नकी है। डिफ़ॉल्ट रूप से, readonly_fields इस फ़ील्ड को उपयोगकर्ता के ईमेल (उदा। [email protected]) युक्त सरल टेक्स्ट के रूप में प्रस्तुत करने का कारण बनता है। मैं उस उपयोगकर्ता के लिए संबंधित व्यवस्थापक पृष्ठ के लिंक के रूप में प्रस्तुत करने के लिए इसे कैसे बदलूं? (उदाहरण के लिए <a href="/admin/auth/user/123/">[email protected]</a>)व्यवस्थापक में Django Readonly ForeignKey फ़ील्ड को एक लिंक के रूप में प्रस्तुत करें

उत्तर

33

स्रोत कोड में खोदने के बाद, मैंने पाया कि आप अनिवार्य रूप से अपने मॉडल एडिन सबक्लास के भीतर अपने स्वयं के फ़ील्ड को परिभाषित कर सकते हैं, और आप विधि से लिंक एचटीएमएल वापस लौटकर एक लिंक के रूप में प्रस्तुत करने के लिए फ़ील्ड प्राप्त कर सकते हैं ।

उदा

from django.contrib import admin 
from django.utils.safestring import mark_safe 
from django.core import urlresolvers 

class MyModelAdmin(admin.ModelAdmin): 

    readonly_fields = ['user_link'] 

    def user_link(self, obj): 
     change_url = urlresolvers.reverse('admin:auth_user_change', args=(obj.user.id,)) 
     return mark_safe('<a href="%s">%s</a>' % (change_url, obj.user.email)) 
    user_link.short_description = 'User' 
+2

यह वास्तव में दस्तावेज है, यद्यपि अप्रत्यक्ष रूप से: 'readonly_fields' के लिए अनुभाग का कहना है कि यह" list_display' के लिंक के साथ "ModelAdmin.list_display" के समान व्यवहार करता है, जहां कस्टम विधि विकल्प परिभाषित किया गया है। –

+6

mark_safe के बजाय 'user_link.allow_tags = True'' करें और फिर यह विधि चेंजलिस्ट में भी काम करती है। –

+0

यदि आप किसी अन्य प्रकार से लिंक कर रहे हैं, तो यह आमतौर पर 'urlresolvers.reverse (' admin: _ _change ', ...) है। उचित तारों के साथ और बदलें। – Seth

1

Cerin का जवाब, मेरे Django 1.8 परियोजना में काम नहीं करता क्योंकि readonly_fields स्ट्रिंग 'USER_LINK' शामिल नहीं होना चाहिए, लेकिन परिभाषित समारोह के लिए एक संदर्भ:

class ProfileAdmin(admin.ModelAdmin): 
    # https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display 
    def user(obj): 
     change_url = reverse('admin:auth_user_change', args=(obj.user.id,)) 
     return mark_safe('<a href="{0}">{1}</a>'.format(change_url, obj.user.email)) 
    user.short_description = 'Edit linked user' 
    raw_id_fields = ('user',) 
    list_display = (user, 'last_name', 'first_name', 'specialization',) 
    list_display_links = ('first_name', 'last_name', ,) 
    readonly_fields = (user, 'user',) 

नोट उपयोगकर्ता (obj) दोनों को ओवरराइड करता है कि Profile.user फ़ील्ड के लिए एकल मॉडल संपादन और मॉडल सूची प्रदर्शन। ध्यान दें कि readonly_fields उपयोगकर्ता और 'उपयोगकर्ता' दोनों का उपयोग करता है, एक लिंक किए गए ईमेल को प्रस्तुत करता है, दूसरा उपयोगकर्ता नाम।

संबंधित मुद्दे