2011-12-28 25 views
8

get_absolute_url()メソッドはクールですが、場合によっては不要です。 django.contrib.auth.models.Userはデフォルトでこれを設定しています。これにより、私のプロジェクトは管理者のリンクが壊れてしまいます。Django:管理者の「サイト上での表示」ボタンを削除するユーザー変更フォーム

どうしたら起こるのを防ぐことができますか?

私の古いプロジェクトの1つでは、ボタンのhtmlを削除したカスタムテンプレートを設定しましたが、スケーラビリティに優れた解決策のようには聞こえません。何か良い?

+4

「スケール」とはどういう意味ですか?数百万の異なるモデルでこれをやりたいときに何が起こるか心配ですか?テンプレートのオーバーライドは、私がこれに使用するソリューションです。 –

+1

すでに回答済みです:http://stackoverflow.com/questions/964868/view-on-site –

答えて

1

これは、Djangoの1.7のように、モデルごとに、行うことができます。

# myapp/admin.py 
from django.contrib import admin 
from myapp.models import MyModel 

class MyModelAdmin(admin.ModelAdmin): 
    view_on_site = False 

admin.site.register(MyModel,MyModelAdmin) 
+0

これはより最近の最良の答えです:-) – nemesisdesign

1

は、最後の手段として、私は、私は、このようなユーザ名の長さ、デフォルトのadminフォーム、__unicode__として修正するためのより良い方法を発見していない方法でのDjangoのcontribのアプリに組み込まれた修正私のINSTALLED_APPSの底にmonkey_patchアプリを持っています

一般的にdjango /をアップグレードするときにちょうどあなたの背中を見てください。

from django.contrib.auth.models import User 
del User.get_absolute_url 
+0

私はこの回答を受け入れていますが、私はそれを熱心に使用していません。しかし、提案をありがとう。 – nemesisdesign

3

私はこれが古いと知っていますが、私は同じことをしなければならなかったときにそれを見つけました。

accountsINSTALLED_APPSが含まれている場合、accounts/admin.pyファイルでサルを修正する方がよいでしょう。

admin.site.unregister(User) 
# We don't want a broken View on Site link. Thanks for that, contrib.auth! 
del User.get_absolute_url 
admin.site.register(User, MyUserAdmin) 
4

サルのパッチの代わりに、JavaScriptを使用してクライアント側のボタンを非表示にすることができます。サイトのボタン上のビューのHTMLは次のようになります。

<li><a href="/admin/r/4/2/" class="viewsitelink">View on site</a></li> 

あなたがちょうどあなたがそのように見える丸いボタンの一部を取得するアンカータグは、Liタグに適用されて非表示にした場合。残念ながら、クラス、名前、またはIDがないので、その特定のliタグを選択するのにcssを使用する簡単な方法はありません。したがって、jqueryを使用すると、セレクタをより詳細に制御できます。あなたの静的フォルダに以下を入れてください。機能はジャンゴで追加されましたUPDATE

from django.contrib.auth.models import User 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.admin import site 

class CustomUserAdmin(UserAdmin): 
    class Media: 
     js = ['admin/user_change_form.js'] 

site.unregister(User) 
site.register(User, CustomUserAdmin) 

:たとえば場所の静的/管理/ user_change_form.jsに

django.jQuery(document).ready(function($) { 
    $(".viewsitelink").parent().css('display', 'none') 
}); 

あなたadmin.pyは、このようなものを見ることができます1.7 ModelAdmin.view_on_siteを使用すると、[サイトに表示]リンクは表示されません。

+0

更新ありがとうございます! – nemesisdesign

6

Django 1.7リンクをクリックすると、「安全でないバージョンのDjangoはサポートされなくなりました。新しいリリースにアップグレードしてください! Djangoの1.9については

、ジャンゴdocumentationで述べたように、溶液を以下は正常に動作します

myappに/ admin.pyで

from django.contrib.admin import AdminSite 
class MyAdminSite(AdminSite): 
    # Disable View on Site link on admin page 
    site_url = None 
+0

最近のベストアンサーです。最近のプロジェクトでこれをやっています。 – nemesisdesign

0

私はDjango 1.4を使用しています。Marwan Alsabbaghのソリューションはうまくいきました。しかし、ユーザーの変更フォームを開いたり、リフレッシュしたりすると、短い瞬きがありました。これは、JQueryがページが読み込まれたときにのみこのボタンを隠すためです。

この小さな問題を解決するために、私はCSSを使用して.change-formブロック全体を隠しました。ページがロードされた後、このブロックの可視性はJQueryによって復元されます。

admin.py:

class Media: 
    js = ['js/admin/user_change_form.js'] 
    css = {'all': ('css/admin/user_change_form.css',)} 

...静的/ CSS /管理/ user_change_form.css

.change-form { 
    visibility: hidden; 
} 

...静的/のJS /管理だから、私のコードは次のようになります/user_change_form.js

/* Do not show 'View on site' button in User change form */ 
django.jQuery(document).ready(function($) { 
    $(".viewsitelink").parent().css('display', 'none') 
    /* restore visibility of the page (hidden in css to avoid blinking) */ 
    $(".change-form").css('visibility', 'visible') 
}); 
関連する問題