2012-03-26 502 views
9

我有一個客戶端,有一個應用程序用Django構建。在每個頁面上的 他們的應用程序是一個鏈接到他們的管理網站。他們告訴我管理網站 完全由django生成,並且他們以前從未定製 。在管理頁面的第一行,它說:添加鏈接到Django管理頁面

 
Django administration   Welcome, admin. Change password/Log out 

他們要我一個鏈接到該行,以「Django的 管理」的,將帶他們回到他們在頁面左側當 他們點擊鏈接,讓他們到管理網站。

所以,我有2個問題在這裏:

  1. 如何覆蓋該行添加鏈接?看起來,頁面 是由contrib/admin/templates/admin/base.html生成的,我試圖通過 https://docs.djangoproject.com/en/1.2/ref/contrib/admin/#overriding-a ..., 來覆蓋它,但是我做的任何事似乎都沒有效果。

  2. 如何獲取他們來自的應用程序頁面的鏈接?它不僅僅是返回一頁,因爲它們可以在管理站點的所有位置上導航所有 ,然後單擊「返回到應用程序」 鏈接。

回答

12

有很多方法可以在request.session中存儲上次訪問的非管理員url。例如,中間件:

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','') 

然後覆蓋模板:1的request.session

  1. Store中的最後一個非管理URL,例如把上面的類yourproject/middleware.py,添加到settings.MIDDLEWARE_CLASSESmiddleware.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,找到{% block branding %},在此塊的H1標記之前,添加一個HTML鏈接到{{ request.session.last_site_url }}

應該看起來像:

{% 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 2012-03-26 14:35:42

+0

感謝您的反饋(答案更新) – jpic 2012-03-26 14:59:59

+0

不客氣。很高興看到改進的答案並從中學習=) – okm 2012-03-26 15:34:39

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上,則不會有absolute_url。在這種情況下,鏈接會將您帶到主頁。

模板/管理/ 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。 html:

{% 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在myapp中。在您的情況下,這可能是不受歡迎的,因爲並非所有模型都在網站中有一個表示(沒有和不需要get_absolute_url)。我想你也可以將模板放在myproject/templates/admin/myapp/MyModel /change_form.html中,以便僅覆蓋MyModel的模板,並使用默認模板在myapp中保留其他模型。我從來沒有使用過一個模型的change_form模板。你能告訴我它是否有效嗎?

非常感謝您:http://djangosnippets.org/snippets/2005/

這個回答你的問題?我希望它有幫助。