2012-03-26 8 views
9

Tengo un cliente que tiene una aplicación creada con django. En cada página de su aplicación es un enlace a su sitio de administración. Me dicen que el sitio de administración es generado completamente por django, y nunca lo han personalizado antes . En la primera línea de la página de administración que dice:Agregar enlace a la página de administración de django

 
Django administration   Welcome, admin. Change password/Log out 

Ellos quieren que añada un enlace a esa línea, a la izquierda de "Django administración" que les llevará de nuevo a la página que estaban en cuando hicieron clic en el enlace para acceder al sitio de administración.

así que tengo 2 problemas aquí:

  1. ¿Cómo omiso de esa línea para añadir el enlace? Parece que la página es generada por contrib/admin/templates/admin/base.html, y probé para anularla siguiendo las instrucciones en https://docs.djangoproject.com/en/1.2/ref/contrib/admin/#overriding-a ..., pero todo lo que hago parece no tener ningún efecto.

  2. ¿Cómo puedo obtener el enlace de la página de la aplicación de donde provienen? Es no simplemente volviendo una página, ya que podrían haber navegado todos sobre el lugar del sitio de administración antes de hacer clic en el enlace "Volver a la aplicación" .

Respuesta

12

Hay muchas formas de almacenar la última url no administrativa visitada en request.session. Por ejemplo, un middleware:

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

se puede redefinir la plantilla:

  1. tienda el último URL de administración no en request.session, por ejemplo, poner la clase anterior en yourproject/middleware.py, añadir a settings.MIDDLEWARE_CLASSES: middleware.LastSiteUrl

  2. Preparar la plantilla de administración local de base para anular, copia django/contrib/admin/templates/admin/base_site.html a yourproject/templates/admin/base_site.html

  3. Enlace a request.session.last_site_url, por ejemplo, en yourproject/templates/admin/base_site.html, busque {% block branding %}, antes de la etiqueta H1 de este bloque, agregue un enlace HTML al {{ request.session.last_site_url }}.

Debe quedar como que:

{% 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 ayuda – okm

+0

Gracias por su retroalimentación (respuesta actualizada) – jpic

+0

De nada. Es bueno ver una respuesta mejorada y aprender de ella =) – okm

1

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:

  1. Asegúrese de que su modelo contiene una función get_absolute_url .
  2. Anula la respuesta del administrador para redirigir a esta absolute_url.
  3. 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.

Cuestiones relacionadas