添加到Django admin pag的链接

2024-05-15 12:09:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个客户端,它有一个用django构建的应用程序。每页 他们的应用程序是他们的管理网站的链接。他们告诉我管理网站 完全由django生成,而且他们从未定制过 以前。在管理页面的第一行显示:

Django administration          Welcome, admin. Change password / Log out

他们要我在“Django”的左边加一个链接 “管理”这会让他们回到他们在 他们点击了链接,把他们带到了管理网站。

所以我有两个问题:

  1. 如何重写该行以添加链接?看来那一页 是由contrib/admin/templates/admin/base.html生成的,我尝试了 通过遵循 https://docs.djangoproject.com/en/1.2/ref/contrib/admin/#overriding-a。。。, 但无论我做什么似乎都没有效果。

  2. 我怎样才能得到他们的应用程序页面的链接?它是 不仅仅是返回一页,因为他们可以浏览所有的 在单击“返回应用程序”之前在管理站点的位置 链接。


Tags: djangolog应用程序客户端admin网站链接password
2条回答

简单的方法:

如果模型具有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也很容易跳到当前模型条目的网站表示。这里我们检查当前模型是否包含绝对url。如果您不在更改页上,则不会有绝对的url。在这种情况下,该链接会将您带到主页。

模板/admin/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. 重写管理响应以重定向到此绝对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/templates/admin/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 %}

模板将覆盖myapp中每个模型的更改表单。这在您的情况下可能是不受欢迎的,因为并非所有的模型都在网站中有一个表示(没有和不需要get_absolute_url)。我认为您还可以将模板放在myproject/templates/admin/myapp/MyModel/change_form.html,以便仅覆盖MyModel的模板,并使用默认模板将其他模型保留在myapp中。我从来没有为一个模型使用过更改表单模板。你能告诉我它是否有效吗?

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

这回答了你的问题吗?我希望有帮助。

有很多方法可以将上次访问的非管理员url存储在request.session中。例如,中间件:

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. 将最后一个非管理url存储在request.session中,例如将上述类放入yourproject/middleware.py,添加到settings.MIDDLEWARE_CLASSESmiddleware.LastSiteUrl

  2. 准备用于覆盖的管理基站点模板,将django/contrib/admin/templates/admin/base_site.html复制到yourproject/templates/admin/base_site.html

  3. 链接到request.session.last_site_url,例如在yourproject/templates/admin/base_site.html中,找到{% block branding %},在此块的H1标记之前,向{{ 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 %}

相关问题 更多 >