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.
- 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 .
- Überschreiben Sie die Admin-Antwort, um auf diese absolute_url umzuleiten.
- Ü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.
request.session hilft – okm
Vielen Dank für Ihr Feedback (Antwort aktualisiert) – jpic
Gern geschehen. Es ist gut, verbesserte Antwort zu sehen und daraus zu lernen =) – okm