2012-03-26 13 views
9

पर एक लिंक जोड़ना मेरे पास एक क्लाइंट है जिसमें डीजेंगो के साथ बनाया गया ऐप है। के प्रत्येक पृष्ठ पर उनका ऐप उनकी व्यवस्थापक साइट का एक लिंक है। वे मुझे बताते हैं कि व्यवस्थापक साइट पूरी तरह से django द्वारा जेनरेट की गई है, और उन्होंने इसे कभी भी को अनुकूलित नहीं किया है। व्यवस्थापक पृष्ठ की बहुत पहली पंक्ति पर यह कहते हैं:django व्यवस्थापक पृष्ठ

 
Django administration   Welcome, admin. Change password/Log out 

उन्होंने मुझे का "Django प्रशासन" बाएं कि उन्हें पेज वे पर थे करने के लिए वापस ले जाएगा करने के लिए है कि लाइन के लिए एक लिंक जोड़ने के लिए, चाहते हैं जब उन्होंने उन्हें व्यवस्थापक साइट पर लाने के लिए लिंक पर क्लिक किया।

  1. मैं लिंक जोड़ने के लिए है कि रेखा कैसे ओवरराइड करते हैं:

    तो मैं 2 मुद्दों यहाँ है? ऐसा प्रतीत होता है कि पृष्ठ contrib/admin/templates/admin/base.html द्वारा उत्पन्न होता है, और मैंने को https://docs.djangoproject.com/en/1.2/ref/contrib/admin/#overriding-a पर दिशानिर्देशों का पालन करके इसे ओवरराइड करने की कोशिश की ..., लेकिन जो कुछ भी मुझे लगता है उसका कोई प्रभाव नहीं पड़ता है।

  2. मैं उन ऐप के पेज का लिंक कैसे प्राप्त कर सकता हूं जो वे आए थे? यह बस एक पृष्ठ पर वापस नहीं जा रहा है, क्योंकि वे "वापस ऐप" लिंक पर क्लिक करने से पहले व्यवस्थापक साइट के स्थान पर सभी पर नेविगेट कर सकते थे।

उत्तर

12

request.session में अंतिम बार गए गैर-व्यवस्थापक यूआरएल को स्टोर करने के कई तरीके हैं। उदाहरण के लिए, एक मिडलवेयर: request.session में

  1. स्टोर पिछले गैर व्यवस्थापक यूआरएल, उदहारण के लिए:

    import re 
    
    class LastSiteUrl(object): 
        def is_admin_url(self, url): 
         return re.search('^(http:\/\/.*){0,1}\/admin\/', url) is not None 
    
        def process_request(self, request): 
         if self.is_admin_url(request.path) and \ 
          not self.is_admin_url(request.META.get('HTTP_REFERER','')): 
          request.session['last_site_url'] = request.META.get('HTTP_REFERER','') 
    

    फिर टेम्पलेट ओवरराइड yourproject/middleware.py में ऊपर वर्ग डाल settings.MIDDLEWARE_CLASSES को जोड़ने के लिए,:, middleware.LastSiteUrl

  2. ओवरराइड करने के लिए व्यवस्थापक आधार साइट टेम्पलेट तैयार कॉपी django/contrib/admin/templates/admin/base_site.htmlyourproject/templates/admin/base_site.html लिंक करने के लिए

  3. , उदा request.session.last_site_url को yourproject/templates/admin/base_site.html में, इस ब्लॉक के एच 1 टैग से पहले {% block branding %} खोजें, {{ request.session.last_site_url }} पर एक HTML लिंक जोड़ें।

ऐसा नहीं है कि तरह दिखना चाहिए:

{% block branding %} 
    {% if request.session.last_site_url %} 
     <a href="{{ request.session.last_site_url }}">back to site</a> 
    {% endif %} 
    <h1 id="site-name">{% trans 'Django administration' %}</h1> 
{% endblock %} 
+1

request.session – okm

+0

आपकी प्रतिक्रिया के लिए धन्यवाद (उत्तर अपडेट) – jpic

+0

आपका स्वागत है। बेहतर उत्तर देखना और इससे सीखना अच्छा होता है =) – okm

1

आसान तरीका:

एक मॉडल एक get_absolute_url समारोह है, तो व्यवस्थापक 'परिवर्तन' पृष्ठों एक 'साइट पर दृश्य' शामिल बटन पृष्ठ के ऊपरी दाएं भाग पर। तो सुनिश्चित करें कि आपके मॉडल get_absolute_url शामिल हैं: क्योंकि वस्तु बनाया जाना इससे पहले कि आप यात्रा कर सकते हैं की जरूरत है

def get_absolute_url(self): 
     return '/myapp/%s' %self.slug #this should reflect your url-structure. 

'साइट पर दृश्य' बटन 'जोड़ें' पृष्ठ पर नहीं है।अपने क्लाइंट को बताएं कि वह 'सेव' हिट नहीं करने के लिए एक नया ऑब्जेक्ट बना रहा है, लेकिन 'सेव करें और संपादन जारी रखें' और 'साइट पर देखें' पर क्लिक करें।

अब base_site.html को ओवरराइड करके मौजूदा मॉडल प्रविष्टि की वेबसाइट प्रस्तुति पर कूदना भी आसान है। यहां हम जांचते हैं कि वर्तमान मॉडल में absolute_url है या नहीं। यदि आप change_page पर नहीं हैं, तो एक पूर्ण_यूआरएल नहीं होगा। इस मामले में लिंक आपको होमपेज पर ले जाता है।

टेम्पलेट्स/एडमिन/base_site.html

{% extends "admin/base.html" %} 
{% load i18n %} 

{% block title %}{{ title }} | {% trans 'Django site admin' %}{% endblock %} 

{% block branding %} 
<h1 id="site-name">{% if has_absolute_url %}<a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink">{% else %}<a href="http://{{ site.domain }}">{% endif %}{{ site.domain }}</a>  

Sitebeheer{#{% trans 'Django administration' %}#}</h1> 
{% endblock %} 

{% block nav-global %}{% endblock %} 

हो गया!

निम्नलिखित समाधान आपके प्रश्न का उत्तर भी देता है लेकिन एक अलग तरीके से।

  1. सुनिश्चित करें कि आपके मॉडल एक get_absolute_url समारोह में शामिल करें: यह अगले 'बचाने के लिए और जारी रखने के लिए' और व्यवस्थापक पर बटन 'सहेजें' 'जोड़ें' और 'बदलें' पृष्ठों के लिए एक 'बचाने के लिए और साइट पर दृश्य' बटन जोड़ देगा ।
  2. इस absolute_url पर रीडायरेक्ट करने के लिए व्यवस्थापक प्रतिक्रिया को ओवरराइड करें।
  3. 'साइट पर सहेजें और देखें' बटन जोड़ने के लिए change_form.html ओवरराइड करें।

संपादित MyProject/MyApp/models.py

class MyModel(models.Model): 
    title = models.CharField("titel", max_length=200) 
    slug = models.SlugField(unique=True) 

    def __unicode__(self): 
     return self.title 

    def get_absolute_url(self): 
     return '/myapp/%s' %self.slug 

संपादित MyProject/MyApp/admin.py

from models import MyModel 

class MyModelAdmin(admin.ModelAdmin): 
    ... 

    def response_change(self, request, obj): 
     """ 
     Determines the HttpResponse for the change_view stage. 
     """ 
     if request.POST.has_key("_viewsite"): 
      msg = (_('The %(name)s "%(obj)s" was changed successfully.') % 
        {'name': force_unicode(obj._meta.verbose_name), 
        'obj': force_unicode(obj)}) 
      return HttpResponseRedirect(obj.get_absolute_url()) 
     return super(MyModel, self).response_change(request, obj) 

admin.site.register(MyModel, MyModelAdmin) 

एक नई फ़ाइल MyProject/टेम्पलेट्स/व्यवस्थापक/MyApp/change_form बनाएँ। एचटीएमएल:

{% extends "admin/change_form.html" %} 
{% load i18n %} 
{% block content %} 
{{ block.super }} 
<script type="text/javascript">//<![CDATA[ 
    (function($){ 
     $('<input type="submit" value="Save and view on site" name="_viewsite" />') 
     .prependTo('div.submit-row'); 
    })(django.jQuery); 
//]]></script> 
{% endblock %} 

टेम्पलेट प्रत्येक मॉडल के लिए change_form को ओवरराइड करेगा I एन मैप। यह आपकी परिस्थिति में अवांछित हो सकता है क्योंकि सभी मॉडलों में वेबसाइट में कोई प्रतिनिधित्व नहीं है (get_absolute_url की आवश्यकता नहीं है और इसकी आवश्यकता नहीं है)। मुझे लगता है कि आप टेम्पलेट को Myproject/templates/admin/myapp/MyModel /change_form.html पर केवल MyModel के लिए टेम्पलेट को ओवरराइड करने और डिफ़ॉल्ट टेम्पलेट के साथ अन्य मॉडल को छोड़ने के लिए टेम्पलेट भी डाल सकते हैं। मैंने कभी भी एक मॉडल के लिए बदलाव_फॉर्म टेम्पलेट का उपयोग नहीं किया। क्या यह मुझे बताएगा अगर यह काम करता है?

एक बड़ा के लिए धन्यवाद: http://djangosnippets.org/snippets/2005/

इससे आपके प्रश्न का उत्तर दिया? मुझे उम्मीद है यह मदद करेगा।

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