2012-03-26 11 views
9

私はdjangoで構築されたアプリを持っているクライアントを持っています。 のすべてのページで、そのアプリは管理サイトへのリンクです。彼らはadminサイト が完全にdjangoによって生成されたことを教えてくれています。それ以前には をカスタマイズしたことはありません。管理ページの一番最初の行で、それは言う:djangoの管理ページへのリンクを追加

 
Django administration   Welcome, admin. Change password/Log out 

彼らは私が彼らがいたページに戻ってそれらを取るでしょう「ジャンゴ 政権」の左側に、その行へのリンクを追加したいです リンクをクリックして管理サイトに移動したとき。

  1. どのようにリンクを追加するには、その行を上書きしない:

    だから私はここで2つの問題がありますか?ページ がcontrib/admin/templates/admin/base.htmlによって生成されているようで、 を https://docs.djangoproject.com/en/1.2/ref/contrib/admin/#overriding-a ...、 の指示に従って書き換えようとしましたが、何も効果がないようです。

  2. は、どのように私は、彼らがどこから来たアプリのページのリンクを得ることができますか?それは、彼らが「戻るアプリに」 のリンクをクリックする前に、adminサイトの場所にすべて をナビゲートしている可能性があるので単純に、バック1ページつもりはない です。

答えて

12

最後に訪問したnon-admin 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. ストアますrequest.sessionの最後の非管理URL、例えば、例えばrequest.session.last_site_urlするdjango/contrib/admin/templates/admin/base_site.htmlリンク

  2. yourproject/templates/admin/base_site.htmlにコピーし、middleware.LastSiteUrl

  3. をオーバーライドするために、管理ベースサイトのテンプレートを準備しますsettings.MIDDLEWARE_CLASSESに追加し、yourproject/middleware.pyで上記のクラスを置きますyourproject/templates/admin/base_site.html{% block branding %}を見つけ、このブロックのH1タグの前にHTMLリンクを{{ request.session.last_site_url }}に追加します。

それはそのようになります。モデルははget_absolute_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

request.session help – okm

+0

あなたのご意見ありがとうございます(回答が更新されました) – jpic

+0

よろしくお願いいたします。改善された答えを見てそれから学ぶのは良いことです=) – okm

1

簡単な方法をページの右上にあります。あなたはそれを訪問することができます前に、オブジェクトを作成する必要があるため

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

「ビューサイト上」ボタンは、「追加」ページではありません:だから、あなたのモデルはget_absolute_url含まれていることを確認してください。新しいオブジェクトを作成して「保存」をクリックしないで「保存して編集を続行」し、「サイトで表示」をクリックするよりも、クライアントに伝えてください。

これで、base_site.htmlを上書きすることで、現在のモデルエントリのウェブサイト表現に簡単にジャンプできます。ここでは、現在のモデルにabsolute_urlが含まれているかどうかを確認します。あなたがchange_pageにいない場合は、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 %} 

次の解決方法もあなたの質問に答えますが、別の方法で解決します。これは、「保存して続行」と「追加」と「変更」ページの管理上のボタンを「保存」の隣に「保存し、ビューサイト上」ボタンを追加します。

  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を作成/テンプレート/管理/ 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 %} 

テンプレートは、モデルiごとにchange_formを上書きしますn myapp。あなたの状況では、すべてのモデルがWebサイトに表現されているわけではありません(get_absolute_urlを持たないため、get_absolute_urlは必要ありません)。私は、テンプレートをmyproject/templates/admin/myapp/MyModel /change_form.htmlに置くことで、MyModelのテンプレートをオーバーライドし、他のモデルをデフォルトのテンプレートでmyappに残すこともできると思います。私は、単一のモデルに対してchange_formテンプレートを使用したことはありません。それが働いたら教えてくれますか?

大きいが、ありがとうございました:http://djangosnippets.org/snippets/2005/

この回答はお役に立ちましたか?私はそれが助けて欲しい

関連する問題