Добавление ссылки на админку django - PullRequest
11 голосов
/ 26 марта 2012

У меня есть клиент, у которого есть приложение, созданное с помощью django. На каждой странице их приложение является ссылкой на их сайт администратора. Они говорят мне администратор сайта полностью генерируется django, и они никогда не настраивали его до. На самой первой строке страницы администратора написано:

Django administration          Welcome, admin. Change password / Log out

Они хотят, чтобы я добавил ссылку на эту строку слева от "Django". администрация ", которая вернет их на страницу, на которой они находились они нажали на ссылку, чтобы получить их на сайте администратора.

Итак, у меня есть 2 вопроса здесь:

  1. Как мне переопределить эту строку, чтобы добавить ссылку? Похоже, эта страница генерируется contrib / admin / templates / admin / base.html, и я попытался переопределить его, следуя указаниям на https://docs.djangoproject.com/en/1.2/ref/contrib/admin/#overriding-a..., но все, что я делаю, похоже, не имеет никакого эффекта.

  2. Как получить ссылку на страницу приложения, с которого они пришли? Это не просто вернуться назад на одну страницу, так как они могли бы перемещаться по всем над местом администратора сайта, прежде чем нажать «Вернуться к приложению» ссылка.

Ответы [ 2 ]

13 голосов
/ 26 марта 2012

Есть много способов сохранить последний посещенный неадминный URL в request.session.Например, промежуточное программное обеспечение:

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

Затем переопределите шаблон:

  1. Сохраните последний неадресный URL в request.session , напримерпоместите вышеуказанный класс в yourproject/middleware.py, добавьте к settings.MIDDLEWARE_CLASSES: middleware.LastSiteUrl

  2. Подготовьте базовый шаблон сайта администратора для переопределения , скопируйте django/contrib/admin/templates/admin/base_site.html вyourproject/templates/admin/base_site.html

  3. Ссылка на request.session.last_site_url , например, в yourproject/templates/admin/base_site.html, найдите {% block branding %}, перед тегом H1 этого блока добавьтеHTML-ссылка на {{ request.session.last_site_url }}.

Это должно выглядеть так:

{% 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 голос
/ 30 марта 2012

Простой способ:

Если модель имеет функцию 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. Если вы не находитесь на странице изменений, не будет абсолютного индекса. В этом случае ссылка ведет на домашнюю страницу.

шаблоны / админ / 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 %}

Готово! * * 1013

Следующее решение также ответит на ваш вопрос, но по-другому. Это добавит кнопку «сохранить и просмотреть на сайте» рядом с кнопками «сохранить и продолжить» и «сохранить» на страницах администратора «добавить» и «изменить»:

  1. Убедитесь, что ваша модель содержит функцию get_absolute_url.
  2. Переопределить ответ администратора для перенаправления на этот absolute_url.
  3. Переопределите файл 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 %}

Шаблон переопределит change_form для каждой модели в myapp. Это может быть нежелательно в вашей ситуации, потому что не все модели имеют представление на веб-сайте (не имеют и не нуждаются в get_absolute_url). Я думаю, вы также можете поместить шаблон в myproject / templates / admin / myapp / MyModel / change_form.html, чтобы переопределить только шаблон для MyModel и оставить другие модели в myapp с шаблоном de default. Я никогда не использовал шаблон change_form для одной модели. Вы дадите мне знать, сработало ли это?

Большое спасибо за: http://djangosnippets.org/snippets/2005/

Это ответило на ваш вопрос? Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...