आसान तरीका:
एक मॉडल एक 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 %}
हो गया!
निम्नलिखित समाधान आपके प्रश्न का उत्तर भी देता है लेकिन एक अलग तरीके से।
- सुनिश्चित करें कि आपके मॉडल एक get_absolute_url समारोह में शामिल करें: यह अगले 'बचाने के लिए और जारी रखने के लिए' और व्यवस्थापक पर बटन 'सहेजें' 'जोड़ें' और 'बदलें' पृष्ठों के लिए एक 'बचाने के लिए और साइट पर दृश्य' बटन जोड़ देगा ।
- इस absolute_url पर रीडायरेक्ट करने के लिए व्यवस्थापक प्रतिक्रिया को ओवरराइड करें।
- 'साइट पर सहेजें और देखें' बटन जोड़ने के लिए 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/
इससे आपके प्रश्न का उत्तर दिया? मुझे उम्मीद है यह मदद करेगा।
request.session – okm
आपकी प्रतिक्रिया के लिए धन्यवाद (उत्तर अपडेट) – jpic
आपका स्वागत है। बेहतर उत्तर देखना और इससे सीखना अच्छा होता है =) – okm