La forma más fácil:
Si un modelo tiene una función get_absolute_url, las páginas de 'cambio' de administración contener una 'vista en el sitio' botón en la parte superior derecha de la página. Así que asegúrese de que su modelo contiene get_absolute_url:
botón
def get_absolute_url(self):
return '/myapp/%s' %self.slug #this should reflect your url-structure.
La 'vista en el sitio' no está en la página de 'añadir' porque el objeto tiene que ser creado antes de que pueda visitarla.Dile a tu cliente cuándo está creando un nuevo objeto para NO presionar 'guardar' sino 'guardar y continuar editando' y luego hacer clic en 'ver en el sitio'.
Ahora también es fácil saltar a la representación del sitio web de la entrada del modelo actual anulando el base_site.html. Aquí verificamos si el modelo actual contiene absolute_url. Si no está en un change_page, no habrá una absolute_url. En este caso, el enlace lo lleva a la página de inicio.
plantillas/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 %}
hecho!
La siguiente solución también responde su pregunta pero de una manera diferente. Esto agregará un botón de 'guardar y vista en el sitio' junto a 'guardar y continuar' y 'salvar' botones del administrador 'añadir' y 'cambio' páginas:
- Asegúrese de que su modelo contiene una función get_absolute_url .
- Anula la respuesta del administrador para redirigir a esta absolute_url.
- Sobreescribe change_form.html para agregar un botón 'guardar y ver en el sitio'.
Editar miproyecto/miaplicacion/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
Editar miproyecto/miaplicacion/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)
Crear un nuevo archivo miproyecto/plantillas/admin/miaplicacion/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 %}
La plantilla anulará el change_form para cada modelo i n el myapp. Esto podría ser indeseable en su situación porque no todos los modelos tienen una representación en el sitio web (no tienen y no necesitan get_absolute_url). Creo que también puede colocar la plantilla en myproject/templates/admin/myapp/MyModel /change_form.html para anular solo la plantilla de MyModel y dejar otros modelos en myapp con la plantilla predeterminada. Nunca utilicé una plantilla change_form para un solo modelo. ¿Me harías saber si funcionó?
Un gran agradecimiento para: http://djangosnippets.org/snippets/2005/
¿Esto responde a su pregunta? Espero que ayude.
request.session ayuda – okm
Gracias por su retroalimentación (respuesta actualizada) – jpic
De nada. Es bueno ver una respuesta mejorada y aprender de ella =) – okm