简单的方法:
如果模型具有 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。在这种情况下,链接会将您带到主页。
templates/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 %}
完成!
以下解决方案也可以回答您的问题,但方式不同。这将在管理员“添加”和“更改”页面上的“保存并继续”和“保存”按钮旁边添加一个“保存并在网站上查看”按钮:
- 确保您的模型包含 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/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 中每个模型的 change_form。在您的情况下,这可能是不可取的,因为并非所有模型在网站中都有表示(没有也不需要 get_absolute_url)。我认为您也可以将模板放在 myproject/templates/admin/myapp/MyModel/change_form.html 中,以仅覆盖 MyModel 的模板,并使用默认模板将其他模型留在 myapp 中。我从未对单个模型使用 change_form 模板。你会告诉我它是否有效吗?
非常感谢您:http://djangosnippets.org/snippets/2005/
这是否回答了您的问题?希望对你有帮助。