किसी वस्तु के लिए Django व्यवस्थापक url प्राप्त करना


168

Django 1.0 से पहले वहाँ एक आसान तरीका था एक वस्तु के व्यवस्थापक यूआरएल पाने के लिए, और मैं एक छोटा सा फिल्टर लिखा था कि मैं इस तरह का उपयोग करेगा: <a href="{{ object|admin_url }}" .... > ... </a>

मूल रूप से मैं url रिवर्स फ़ंक्शन का उपयोग दृश्य नाम के साथ कर रहा था 'django.contrib.admin.views.main.change_stage'

reverse( 'django.contrib.admin.views.main.change_stage', args=[app_label, model_name, object_id] )

url प्राप्त करने के लिए।

जैसा कि आप अनुमान लगा सकते हैं, मैं Django के नवीनतम संस्करण को अपडेट करने की कोशिश कर रहा हूं, और यह उन बाधाओं में से एक है, जो कि व्यवस्थापक url प्राप्त करने के लिए उस विधि से अब काम नहीं करता है।

मैं इसे django 1.0 में कैसे कर सकता हूं? (या उस मामले के लिए 1.1, जैसा कि मैं svn में नवीनतम संस्करण को अपडेट करने की कोशिश कर रहा हूं)।

जवाबों:


61

मेरे पास एक समान मुद्दा था जहां मैं कॉल करने की कोशिश करूंगा reverse('admin_index')और लगातार django.core.urlresolvers.NoReverseMatchत्रुटियां हो रही थीं।

यह बताता है कि मेरे पास मेरी urls.py फ़ाइल में पुराना प्रारूप व्यवस्थापक url था।

मेरे पास मेरे urlpatterns में यह था:

(r'^admin/(.*)', admin.site.root),

जो काम करता है व्यवस्थापक स्क्रीन हो जाता है, लेकिन यह करने का पदावनत तरीका है। मुझे इसे इसे बदलने की आवश्यकता है:

(r'^admin/', include(admin.site.urls) ),

एक बार जब मैंने ऐसा किया, तो रिवर्सिंग एडमिन यूआरएल डॉक्स में वादा किया गया सभी अच्छाई काम करना शुरू कर दिया।


बहुत बढ़िया, यह एक और मुद्दा है जो मुझे मिल रहा था। धन्यवाद!
अरनौद

8
इस समस्या के लिए सबसे अच्छा url: docs.djangoproject.com/en/dev/ref/contrib/admin/…
Dingo

4
यह "उत्तर" सही नहीं है यह दिखाता है कि कैसे अपने ऐप में व्यवस्थापक ऐप को ठीक से जोड़ना है, जिसने एक अलग समस्या को हल किया है जो लेखक के पास था। वास्तविक प्रश्न का वास्तविक उत्तर नीचे है - मार्कमुएट्ज़ से
डेक्लान शनाघी

साथ ही, आपको मॉडल के लिए पंजीकृत व्यवस्थापक इंटरफ़ेस की आवश्यकता होगी, अन्यथा URL मौजूद नहीं होगा।
13

412

आप URL रिज़ॉल्वर को सीधे टेम्प्लेट में उपयोग कर सकते हैं, आपको अपना फ़िल्टर लिखने की कोई आवश्यकता नहीं है। उदाहरण के लिए

{% url 'admin:index' %}

{% url 'admin:polls_choice_add' %}

{% url 'admin:polls_choice_change' choice.id %}

{% url 'admin:polls_choice_changelist' %}

रेफरी: प्रलेखन


1
markmuetz - क्या यह आधिकारिक Django डॉक्स में कहीं भी है? (कैसे टेम्पलेट्स में व्यवस्थापक रिवर्स यूआरएल का उपयोग करने के लिए)? यदि नहीं, तो इसे होना चाहिए।
शकर

7
शेकर - यह सब डॉक्स में है ... सिर्फ एक जगह पर नहीं। "Url" टेम्प्लेट टैग यहां प्रलेखित है । "नई Django 1.1:" अनुभाग में, डॉक्स कहते हैं कि नामांकित URL ठीक हैं, और आपको URL नामस्थान पर अनुभाग इंगित करता है । यह सब एक साथ चिपकाकर आप टेम्प्लेट में व्यवस्थापक एप्लिकेशन को आसानी से संदर्भित कर सकते हैं। एनबी मुझे याद है जब मैंने उत्तर लिखा था तो डॉक्स अलग हो रहे हैं।
मार्कमुएट्ज

3
क्या आप जानते हैं कि विकल्पों की "सूची" के लिए एक लिंक कैसे प्राप्त करें? उदाहरण: यदि "{% url admin: polls_choice_add%}" देता है "/ admin / polls / choice / add" क्या वह समतुल्य होगा जो मुझे देगा "/ व्यवस्थापक / चुनाव / पसंद"?
डार्विनसुरिवोर

2
{% url admin: polls_choice_changelist%} / / admin / polls / choice ’url
luc

35
एक व्यवस्थापक url को उलटना वर्तमान में पूरी तरह से यहाँ प्रलेखित है https://docs.djangoproject.com/en/dev/ref/contrib/admin/#reversing-admin-urls
जोश रूसो

101
from django.core.urlresolvers import reverse
def url_to_edit_object(obj):
  url = reverse('admin:%s_%s_change' % (obj._meta.app_label,  obj._meta.model_name),  args=[obj.id] )
  return u'<a href="%s">Edit %s</a>' % (url,  obj.__unicode__())

यह hansen_j के समाधान के समान है सिवाय इसके कि यह url नामस्थान , व्यवस्थापक का उपयोग करता है : व्यवस्थापक का डिफ़ॉल्ट एप्लिकेशन नामस्थान होने के नाते।


3
धन्यवाद, यह मदद करता है। एक चीज जो मैं बदलूंगा: args=[object.pk]इसके बजाय का उपयोग करें args=[object.id]। यह अधिक सामान्य मामले को शामिल करता है, जब प्राथमिक कुंजी क्षेत्र की तुलना में दूसरा नाम होता है id
डंठल

5
अच्छा उत्तर। FYI करें अधिक नया Django का उपयोग कर किसी object._meta.model_name को object._meta.module_name बदलना होगा
Jagu

बिग एक नौसिखिया नौसिखिया से धन्यवाद। object._meta.app_labelमुझे अंततः django के अपने प्रमाणीकरण ऐप के लिए नाम प्राप्त करने दें। यह authउदाहरण के reverse(admin:auth_user_change, args=[object.id])लिए परिवर्तन उपयोगकर्ता पृष्ठ पर जाने के लिए है
Gret

2
ऑब्जेक्ट को obj में बदलना सुनिश्चित करें। यह लड़का प्रतीक में निर्मित एक आरक्षित लेखन पर है।
केविन पार्कर

17

बाद के संस्करणों के लिए एक और तरीका है, उदाहरण के लिए 1.10 में :

{% load admin_urls %}
<a href="{% url opts|admin_urlname:'add' %}">Add user</a>
<a href="{% url opts|admin_urlname:'delete' user.pk %}">Delete this user</a>

जहां optsकुछ ऐसा है mymodelinstance._metaयाMyModelClass._meta

एक गोटा है कि आप सीधे Django टेम्प्लेट (जैसे {{ myinstance._meta }}) में अंडरस्कोर विशेषताओं तक नहीं पहुंच सकते हैं, इसलिए आपको optsऑब्जेक्ट को टेम्प्लेट के संदर्भ में देखने से पास करना होगा ।


2
डॉक्स यूआरएल बदल गया है! देखें: docs.djangoproject.com/en/1.9/ref/contrib/admin/…
Wim Feijen

12

अनिवार्य रूप से माइक रामिरेज़ के जवाब के समान, लेकिन सरल और शैली में करीब django मानक get_absolute_urlविधि:

def get_admin_url(self):
    return reverse('admin:%s_%s_change' % (self._meta.app_label, self._meta.model_name),
                   args=[self.id])

11

1.1 पूर्व django के लिए यह सरल है (डिफ़ॉल्ट व्यवस्थापक साइट उदाहरण के लिए):

reverse('admin_%s_%s_change' % (app_label, model_name), args=(object_id,))

8
नए नामस्थान के साथ यह व्यवस्थापन है:% s_% s_change
Teebes

3

यदि आप 1.0 का उपयोग कर रहे हैं, तो एक कस्टम टेम्प्लेटेट बनाने की कोशिश करें जो इस तरह दिखता है:

def adminpageurl(object, link=None):
    if link is None:
        link = object
    return "<a href=\"/admin/%s/%s/%d\">%s</a>" % (
        instance._meta.app_label,
        instance._meta.module_name,
        instance.id,
        link,
    )

फिर अपने टेम्पलेट में {% adminpageurl my_object%} का उपयोग करें (पहले टेम्प्लेटेट लोड करना न भूलें)


1

मैंने अभिव्यक्ति को बदलकर इसे हल किया:

reverse( 'django-admin', args=["%s/%s/%s/" % (app_label, model_name, object_id)] )

इसके लिए यह आवश्यक है कि मान लिया जाए कि रूट url conf में "एडमिन" url हैंडलर का नाम है, मुख्य रूप से वह नाम "django-admin" है,

रूट url conf में अर्थात:

url(r'^admin/(.*)', admin.site.root, name='django-admin'),

यह काम करने लगता है, लेकिन मुझे इसकी साफ-सफाई पर यकीन नहीं है।


2
यह 1.0 के लिए काम करता है, लेकिन 1.1 के लिए काम नहीं करेगा, जिसका बेहतर समाधान है: एलेक्स कोशेलेव का जवाब देखें।
कार्ल मेयर

वास्तव में मैंने इसकी कोशिश की और यह काम नहीं किया, और उन्होंने कहा कि यह 1.0 के लिए है, नहीं?
hasen


-1

यहाँ एक और विकल्प है, मॉडल का उपयोग करते हुए:

एक आधार मॉडल बनाएं (या किसी विशेष मॉडल में admin_link विधि जोड़ें)

class CommonModel(models.Model):
    def admin_link(self):
        if self.pk:
            return mark_safe(u'<a target="_blank" href="../../../%s/%s/%s/">%s</a>' % (self._meta.app_label,
                    self._meta.object_name.lower(), self.pk, self))
        else:
            return mark_safe(u'')
    class Meta:
        abstract = True

उस बेस मॉडल से इनहेरिट

   class User(CommonModel):
        username = models.CharField(max_length=765)
        password = models.CharField(max_length=192)

इसे एक टेम्पलेट में उपयोग करें

{{ user.admin_link }}

या देखें

user.admin_link()

2
मुझे नहीं लगता कि यह एक अच्छा समाधान है। स्ट्रिंग फॉर्मेटिंग के साथ एक URL बनाना एक बुरी आदत है। कृपया रिवर्स () का उपयोग करें।
गुत्थी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.