2012-05-02 13 views
22

पहले से व्यवस्थापक यूआरएल पाने के लिए, आप मेरे सवाल को पढ़ने के लिए धन्यवाद देता हूं।Django - कैसे मॉडल उदाहरण सभी के

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

उत्तर

26

यह Django snippet करना चाहिए:

from django.core import urlresolvers 
from django.contrib.contenttypes.models import ContentType 
from django.db import models 

class MyModel(models.Model): 

    def get_admin_url(self): 
     content_type = ContentType.objects.get_for_model(self.__class__) 
     return urlresolvers.reverse("admin:%s_%s_change" % (content_type.app_label, content_type.model), args=(self.id,)) 

self माता पिता मॉडल श्रेणी को संदर्भित करता है, यानी self.id वस्तु के उदाहरण id को दर्शाता है। विधि हस्ताक्षर के शीर्ष पर @property सजावटी चिपके हुए मॉडल पर आप इसे property के रूप में भी सेट कर सकते हैं।

+0

ये उत्तर काम नहीं कर रहे हैं। मैं बस वापस आ गया "/ व्यवस्थापक/ट्रैकर/ऑर्डर/2 /"। मैं होस्टनाम कैसे प्राप्त करूं? – Greg

+0

@ ग्रेग बेशक, 'get_admin_url()' उपर्युक्त आपको होस्टनाम के बाद भाग लेता है। वर्तमान साइट के होस्टनाम को उचित रूप से प्राप्त करने के लिए Django [साइट्स] (https://docs.djangoproject.com/en/dev/ref/contrib/sites/) ढांचे का उपयोग करें। फिर इसे 'get_admin_url() 'के परिणामस्वरूप उपसर्ग करें। –

+1

1.8 में ठीक काम करता है, – GergelyPolonkai

33

@ जोस्विक जैमिट को छीनने की कोशिश नहीं कर रहा है, लेकिन ContentType का उपयोग करना गलत दृष्टिकोण है। यह सिर्फ एक बर्बाद डीबी क्वेरी है। आप _meta विशेषता से जानकारी की आवश्यकता होती है प्राप्त कर सकते हैं:

from django.core.urlresolvers import reverse 

reverse('admin:{0}_{1}_change'.format(self._meta.app_label, self._meta.model_name), args=(self.pk,)) 

इस पर अधिक Django व्यवस्थापक साइट दस्तावेज़ में, reversing admin urls:

from django.core.urlresolvers import reverse 

info = (model_instance._meta.app_label, model_instance._meta.model_name) 
admin_url = reverse('admin:%s_%s_change' % info, args=(model_instance.pk,)) 
+5

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

4

बस इस एक लाइनर भी अजगर 3 के लिए तैयार है कि का उपयोग करें।

+0

'self._meta.module_name' के बजाय' self._meta.model_name' होना चाहिए। – nedned

+0

धन्यवाद @nedned, – radtek

+0

फिक्सिंग सिर्फ इसलिए कि यह संभव है: 'रिवर्स ('व्यवस्थापक: {m.app_label} _ {m.model_name} _change'.format (m = self._meta), args = [self.pk]) ' – batisteo

7

यह Josvic Zammit के स्निपेट के रूप में एक ही परिणाम देता है, लेकिन डेटाबेस हिट नहीं करता:

from django.core import urlresolvers 
from django.db import models 

class MyModel(models.Model): 

    def get_admin_url(self): 
     return urlresolvers.reverse("admin:%s_%s_change" % (self._meta.app_label, self._meta.model_name), args=(self.id,)) 
+0

परिवर्तन attr' 'model_name' द्वारा module_name' (' module_name' अपरिभाषित है) – ppython

+1

Django 1.8 का नाम बदलकर 'MODULE_NAME' एक मॉडल के मेटा वस्तु में 'MODEL_NAME' से जोड़कर देखते हैं। कोड स्निपेट अपडेट किया गया ... धन्यवाद! –

2

तो, क्रिस, Josvic और जोश से जवाब के संयोजन, यहाँ पर कॉपी-पेस्ट विधि आप में जोड़ सकते हैं आपका मॉडल (Django 1.8.3 पर परीक्षण किया गया)।

def get_admin_url(self): 
    """the url to the Django admin interface for the model instance""" 
    from django.core.urlresolvers import reverse 
    info = (self._meta.app_label, self._meta.model_name) 
    return reverse('admin:%s_%s_change' % info, args=(self.pk,)) 
संबंधित मुद्दे