2009-09-12 12 views
15

किसी मॉडल के लिए व्यवस्थापक परिवर्तन सूची को देखते समय, क्या उन स्तंभों को बनाना संभव है जो उनके संबंधित पृष्ठों पर विदेशी कुंजी लिंक से मेल खाते हैं? एक साधारण उदाहरण है कि मेरे पास एक फू ऑब्जेक्ट है जिसमें बार को एक विदेशी कुंजी के रूप में शामिल किया गया है। अगर मैं फू के लिए व्यवस्थापक परिवर्तन सूची देख रहा हूं (और इसे प्रदर्शन_सूची कॉलम में बार शामिल करने के लिए सेट किया गया है), मुख्य कॉलम Foo इंस्टेंस के संपादन पृष्ठ से लिंक होगा जबकि बार कॉलम Boo इंस्टेंस के संपादन पृष्ठ से लिंक होगा। मैं समझता हूं कि मैं उपयोग किए गए टेम्पलेट को ओवरराइड कर सकता हूं, लेकिन अगर कोई ऐसा समाधान था जिसकी आवश्यकता नहीं थी तो मैं उत्सुक था।विदेशी कुंजी परिवर्तन पृष्ठ पर सूची बदलें लिंक

उत्तर

21

आप चेंजलिस्ट में उपयोग करने के लिए एक कस्टम विधि परिभाषित कर सकते हैं जो लिंक के HTML को लौटाता है। यदि फू बार करने के लिए, एक भी बार के लिए तो प्रत्येक foo लिंक है, तो आपको लगता है कि बार के लिए संपादित करें पृष्ठ से लिंक कर सकते हैं एक विदेशी कुंजी है - कहा गया है अपने प्रश्न के साथ

from django.core.urlresolvers import reverse 

class MyFooAdmin(admin.ModelAdmin): 
    list_display = ('foo', 'bar_link') 

    def bar_link(self, obj): 
     url = reverse('admin:myapp_bar_change', args=(obj.pk,)) 
     return '<a href="%s">Edit Bar</a>' % url 
    bar_link.allow_tags = True 

एक समस्या यह है। हालांकि, प्रत्येक बार एकाधिक फ़ूज़ से लिंक होता है, इसलिए 'फू इंस्टेंस के संपादन पृष्ठ' के लिंक के लिए पूछना समझ में नहीं आता है। फिल्टर करने के लिए सेट के साथ फू के लिए परिवर्तन सूची पृष्ठ के लिए लिंक केवल उदाहरणों है कि इस बार से लिंक दिखाने के आप क्या कर सकते है:

def foo_link(self, obj): 
     url = reverse('admin:myapp_foo_changelist') 
     return '<a href="%s?bar=%s">See Foos</a>' % (url, obj.pk) 
    foo_link.allow_tags = True 
+0

मैं इसे आज़मा दूंगा। फू चेंज पेज से लिंक करके मेरा मतलब है कि फू चेंज सूची से फू चेंज पेज के डिफ़ॉल्ट लिंक को बनाए रखना है (मैं मानता हूं कि मैं इसके साथ बहुत स्पष्ट नहीं था)। – Adam

+2

1.4 या 1.5 में इस पर कोई अपडेट (मेरा मतलब है कि यह Django खुद के लिए एक महान जोड़ जैसा दिखता है, तो शायद यह पहले से ही contrib.admin' में जोड़ा गया है)? –

1

मैंने पाया और डैनियल के जवाब पसंद आया, हालांकि परिवर्तन सूची संस्करण दूर साफ करता है कोई भी परिवर्तन पहले ही हो चुका है तो यह तय करने के लिए कि एक तरीका है:

class CountryAdmin(ModelAdmin): 
    model = Country 
    list_display = ('pk', 'continent_changelist') 

    # ... 

    def queryset(self, request): 
     self._get_params = request.GET 
     return super(CountryAdmin, self).queryset(request) 

    def continent_changelist(self, obj): 
     url = reverse('admin:yourapp_country_changelist') 
     querystring = self._get_params.copy() 
     querystring['continent__id__exact'] = obj.continent.pk 
     return u'<a href="{0}?{1}">{2}</a>'.format(
      url, querystring.urlencode(), obj.continent) 
    continent_changelist.allow_tags = True 

है कि आप एक फिल्टर दे देंगे:

सबसे पहले आप अनुरोध के लिए एक संदर्भ प्राप्त करने की आवश्यकता है, तो आप उस changelist_view या queryset लपेटकर के रूप में मैंने किया था द्वारा कर सकते हैं परिवर्तनीय पंक्तियों के अंदर। मैंने इसे एक और सवाल में उत्तर दिया, लेकिन यह वह स्थान था जहां मैं वास्तव में पहले आया था, इसलिए इसे यहां रिकॉर्ड करना चाहता था। :-)

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