2012-03-26 10 views
9

Ich habe einen Client, der eine App mit Django gebaut hat. Auf jeder Seite von ist ihre App ein Link zu ihrer Admin-Seite. Sie sagen mir, dass die Admin-Site vollständig von Django generiert wird, und sie haben es nie zuvor angepasst. Auf der ersten Zeile der Admin-Seite heißt es:Hinzufügen von Link zu Django Admin-Seite

 
Django administration   Welcome, admin. Change password/Log out 

Sie wollen mir einen Link zu dieser Zeile hinzufügen, links von „Django Verwaltung“, die sie zurück auf die Seite waren sie auf nehmen Bei haben sie auf den Link geklickt, um sie zur Admin-Site zu bringen.

So habe ich 2 Fragen hier:

  1. Wie überschreiben ich diese Zeile den Link hinzufügen? Es scheint, dass die Seite von contrib/admin/templates/admin/base.html generiert wird, und ich versuchte , um es durch Befolgen der Anweisungen unter ..., zu übersteuern, aber was auch immer ich tue scheint keine Wirkung zu haben.

  2. Wie bekomme ich den Link der Seite der App, von der sie kamen? Es ist nicht einfach nur eine Seite zurückgehen, da sie alle über die Stelle der Admin-Site navigiert haben könnten, bevor Sie auf den Link "Back to app" klicken.

Antwort

12

Es gibt viele Möglichkeiten, die zuletzt besuchte Nicht-Admin-URL in request.session zu speichern. Zum Beispiel, eine 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','') 

dann die Vorlage außer Kraft setzen:

  1. Store, um die letzte nicht Admin-URL in request.session, z.B. setzen die obige Klasse in yourproject/middleware.py, in den settings.MIDDLEWARE_CLASSES: middleware.LastSiteUrl

  2. die Admin-Basis-Site-Vorlage vorbereiten für überschreiben, kopieren django/contrib/admin/templates/admin/base_site.html zu yourproject/templates/admin/base_site.html

  3. Link zu request.session.last_site_url, z.B. Suchen Sie in yourproject/templates/admin/base_site.html nach {% block branding %}, fügen Sie vor dem H1-Tag dieses Blocks einen HTML-Link zu {{ request.session.last_site_url }} hinzu.

Es sollte so aussehen:

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

+0

Vielen Dank für Ihr Feedback (Antwort aktualisiert) – jpic

+0

Gern geschehen. Es ist gut, verbesserte Antwort zu sehen und daraus zu lernen =) – okm

1

Der einfache Weg:

Wenn ein Modell eine get_absolute_url Funktion hat, enthalten die admin 'change' Seiten eine 'Ansicht vor Ort' Taste oben rechts auf der Seite. So stellen Sie sicher, dass Ihr Modell enthält get_absolute_url:

def get_absolute_url(self): 
     return '/myapp/%s' %self.slug #this should reflect your url-structure. 

Die ‚Ansicht vor Ort‘ Button ist nicht auf der ‚add‘ Seite, weil das Objekt erstellt werden muss, bevor Sie es besuchen können.Sagen Sie Ihrem Kunden, wenn er ein neues Objekt erstellt, dass er nicht auf "Speichern", sondern auf "Speichern und weiter bearbeiten" klickt und dann auf "Auf der Site anzeigen" klickt.

Jetzt ist es auch einfach, durch Überschreiben der base_site.html zur Website-Darstellung des aktuellen Modelleintrags zu springen. Hier prüfen wir, ob das aktuelle Modell absolute_url enthält. Wenn Sie sich nicht auf einer change_page befinden, wird es keine absolute_url geben. In diesem Fall gelangen Sie über den Link auf die Startseite.

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 %} 

Fertig!

Die folgende Lösung beantwortet Ihre Frage auch auf andere Weise.

  1. Stellen Sie sicher, Ihr Modell enthält eine get_absolute_url Funktion: Dies wird eine ‚speichern und Blick auf Seite‘ Knopf neben ‚Speichern und weiter‘ und ‚Speichern‘ Tasten auf dem admin ‚Add‘ und ‚change‘ Seiten hinzufügen .
  2. Überschreiben Sie die Admin-Antwort, um auf diese absolute_url umzuleiten.
  3. Überschreiben Sie change_form.html, um eine Schaltfläche zum Speichern und Anzeigen auf der Site hinzuzufügen.

bearbeiten 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 

bearbeiten 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) 

Erstellen Sie eine neue Datei 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 %} 

Die Vorlage überschreibt die change_form für jedes Modell i in der myapp. Dies könnte in Ihrer Situation unerwünscht sein, da nicht alle Modelle eine Darstellung auf der Website haben (get_absolute_url nicht haben und nicht brauchen). Ich denke, Sie können die Vorlage auch auf myproject/templates/admin/myapp/MyModel /change_form.html setzen, um nur die Vorlage für MyModel zu überschreiben und andere Modelle in myapp mit der Standardvorlage zu belassen. Ich habe nie eine change_form-Vorlage für ein einzelnes Modell verwendet. Wirst du mich wissen lassen, ob es funktioniert hat?

Ein großes Dankeschön für: http://djangosnippets.org/snippets/2005/

Wurde Ihre Frage beantwortet? Ich hoffe, es hilft.

Verwandte Themen