2010-03-18 25 views
37

एक Django मॉडल एक विदेशी कुंजी फ़ील्ड है, और यदि उस क्षेत्र सूची मोड में दिखाया गया है, तो यह ऊपर पाठ के रूप में, बजाय विदेशी वस्तु के लिए एक लिंक प्रदर्शित करने में पता चलता है ।विदेशी कुंजी

क्या फ्लैट टेक्स्ट की बजाय सभी विदेशी कुंजी स्वचालित रूप से लिंक के रूप में प्रदर्शित करना संभव है?

(निश्चित रूप से यह है कि ऐसा करने के लिए क्षेत्र के आधार द्वारा एक मैदान पर संभव है, लेकिन वहाँ एक सामान्य विधि है?)

उदाहरण:

class Author(models.Model): 
    ... 

class Post(models.Model): 
    author = models.ForeignKey(Author) 

अब मैं ऐसा है कि एक ModelAdmin चुनें लेखक सूची मोड में दिखाता है:

class PostAdmin(admin.ModelAdmin): 
    list_display = [..., 'author',...] 

अब सूची मोड में, लेखक क्षेत्र सिर्फ __unicode__ विधि का उपयोग करेगा लेखक को प्रदर्शित करने के लिए Author कक्षा का। इसके शीर्ष पर मैं लिंक व्यवस्थापक साइट में संबंधित लेखक के यूआरएल को इंगित करना चाहता हूं। क्या यह संभव है?

मैनुअल विधि:

पूर्णता के लिए के लिए, मैं मैनुअल विधि जोड़ें। यह PostAdmin कक्षा में एक विधि author_link जोड़ने के लिए होगा:

def author_link(self, item): 
    return '<a href="../some/path/%d">%s</a>' % (item.id, unicode(item)) 
author_link.allow_tags = True 

है कि विशेष क्षेत्र के लिए काम करेंगे, लेकिन वह नहीं है कि मैं क्या चाहता हूँ। मैं एक ही प्रभाव प्राप्त करने के लिए एक सामान्य विधि चाहता हूं। (समस्याओं में से एक यह है कि django व्यवस्थापक साइट में किसी ऑब्जेक्ट को स्वचालित रूप से पथ का पता लगाने के लिए कैसे करें।)

उत्तर

9

मुझे नहीं लगता कि आप स्वचालित रूप से बॉक्स से बाहर निकलने के लिए एक तंत्र है।

लेकिन जहाँ तक एक व्यवस्थापक संपादित एक वस्तु की आईडी के आधार पर पृष्ठ के लिए पथ का निर्धारण करने के रूप में, आप सभी की जरूरत जानकारी के दो टुकड़े कर रहे हैं:

क) self.model._meta.app_label

ख) self.model._meta.module_name

फिर, उदाहरण के लिए, कि मॉडल के लिए संपादित करें पृष्ठ पर जाने के आप क्या करेंगे:

'../%s_%s_change/%d' % (self.model._meta.app_label, self.model._meta.module_name, item.id) 

पर एक नजर डालेंयह देखने के लिए कि वे इसे कैसे करते हैं।

मुझे लगता है कि आप एक कॉल करने योग्य हो सकते हैं जो मॉडल नाम और आईडी लेता है, लेबल और नाम (डेटाबेस को हिट करने की कोई आवश्यकता नहीं) प्राप्त करने के लिए निर्दिष्ट प्रकार का मॉडल बनाता है और ऊपर यूआरएल उत्पन्न करता है।

लेकिन क्या आप वाकई इनलाइन का उपयोग करके प्राप्त नहीं कर सकते हैं? यह एक बेहतर उपयोगकर्ता इंटरफ़ेस के लिए एक पृष्ठ में सभी संबंधित घटकों के लिए बना देगा ...

संपादित करें:

Inlines (डॉक्स से जुड़े) एक व्यवस्थापक इंटरफ़ेस दो में तोड़ने के बजाय एक पेज में एक माता पिता के बच्चे का रिश्ता प्रदर्शित करने के लिए अनुमति देते हैं।

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

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

+0

इस उत्तर के लिए धन्यवाद! क्या आप इनलाइनों के उपयोग पर विस्तार कर सकते हैं? यह कैसे मदद करेगा? –

+0

@ ओलिवियर: इनलाइनों के बारे में सही दिशा में आपको इंगित करने के लिए मेरा उत्तर संपादित किया। – cethegeek

18

मैं एक ही समस्या का समाधान ढूंढ रहा था और इस प्रश्न में भाग गया ... इसे स्वयं हल कर दिया। ओपी अब और दिलचस्पी नहीं ले सकता है लेकिन यह अभी भी किसी के लिए उपयोगी हो सकता है।

from functools import partial 
from django.forms import MediaDefiningClass 

class ModelAdminWithForeignKeyLinksMetaclass(MediaDefiningClass): 

    def __getattr__(cls, name): 

     def foreign_key_link(instance, field): 
      target = getattr(instance, field) 
      return u'<a href="../../%s/%s/%d">%s</a>' % (
       target._meta.app_label, target._meta.module_name, target.id, unicode(target)) 

     if name[:8] == 'link_to_': 
      method = partial(foreign_key_link, field=name[8:]) 
      method.__name__ = name[8:] 
      method.allow_tags = True 
      setattr(cls, name, method) 
      return getattr(cls, name) 
     raise AttributeError 

class Book(models.Model): 
    title = models.CharField() 
    author = models.ForeignKey(Author) 

class BookAdmin(admin.ModelAdmin): 
    __metaclass__ = ModelAdminWithForeignKeyLinksMetaclass 

    list_display = ('title', 'link_to_author') 

पाइथन> = 2.5 का उपयोग न करने पर Django की 'करी' के साथ 'आंशिक' बदलें।

+1

इटाई स्वाद, आपके उत्तर के लिए धन्यवाद, यह वास्तव में हानिकारक था, लेकिन इससे समस्याएं हो सकती हैं, विवरण [दूसरे प्रश्न के उत्तर में] हैं [http://stackoverflow.com/questions/6473340/link-to-foreignkey- में-admin-कारणों-attributeerror-जब-डिबग-है-झूठी/7192721 # 7192721)। – stepank

+0

मेरे लिए, %s के पूर्ण पथ का उपयोग करके बेहतर काम किया गया, क्योंकि सूची पृष्ठ पर बस ऑब्जेक्ट विवरण पृष्ठ पर लिंक सही होगा। –

+0

ModelAdminWith ... विधि के लिए पैरामीटर क्या है? मेरे पास "MediaDefineClass" फ़ॉर्म के रूप में नहीं है? – Timo

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