2012-03-26 285 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/

这个回答你的问题?我希望它有帮助。