52

Django の管理画面で、「変更するアイテムを選択」ページにあるリンクを無効にして、ユーザーがどこにも移動してアイテムを編集できないようにしたい。(ユーザーがこのリストでできることを一連のドロップダウン アクションに制限します - フィールドの実際の編集は行いません)。

Django にはlinkを表示するフィールドを選択する機能があることがわかりますが、どのフィールドも表示しない方法がわかりませ

class HitAdmin(admin.ModelAdmin):
    list_display = ('user','ip','user_agent','hitcount')
    search_fields = ('ip','user_agent')
    date_hierarchy = 'created'
    list_display_links = [] # doesn't work, goes to default

編集するリンクなしでオブジェクト リストを取得する方法はありますか?

4

13 に答える 13

64

ログビューアをリストとしてのみ使用したかったのです。

私はそれを次のように機能させました:

class LogEntryAdmin(ModelAdmin):
    actions = None
    list_display = (
        'action_time', 'user',
        'content_type', 'object_repr', 
        'change_message')

    search_fields = ['=user__username', ]
    fieldsets = [
        (None, {'fields':()}), 
        ]

    def __init__(self, *args, **kwargs):
        super(LogEntryAdmin, self).__init__(*args, **kwargs)
        self.list_display_links = (None, )

それは、両方の答えの一種の組み合わせです。

self.list_display_links = ()とにかく、template-tagコード(templatetags / admin_list.py)がリストが空かどうかを再度確認するため、これを行うだけでリンクが表示されます。

于 2009-12-30T21:02:14.110 に答える
21

Django 1.7以降では、次のことができます

class HitAdmin(admin.ModelAdmin):
    list_display_links = None
于 2014-03-13T13:56:36.377 に答える
20

上記のコメントでユーザー omat が言及したように、単純にリンクを削除しようとしても、ユーザーが変更ページに手動でアクセスすることはできません。ただし、これも簡単に修正できます。

class MyModelAdmin(admin.ModelAdmin)
    # Other stuff here
    def change_view(self, request, obj=None):
        from django.core.urlresolvers import reverse
        from django.http import HttpResponseRedirect
        return HttpResponseRedirect(reverse('admin:myapp_mymodel_changelist'))
于 2011-04-29T21:04:02.740 に答える
8

モデル管理セットで:

list_display_links = (None,)

それはそれを行う必要があります。(とにかく 1.1.1 で動作します。)

ドキュメントへのリンク: list_display_links

于 2009-11-02T02:09:42.527 に答える
4

注意点として、changelist_view を次のように変更できます。

class SomeAdmin(admin.ModelAdmin):
    def changelist_view(self, request, extra_context=None):
        self.list_display_links = (None, )
        return super(SomeAdmin, self).changelist_view(request, extra_context=None)

これは私にとってはうまくいきます。

于 2013-03-22T08:16:51.793 に答える
2

これを行う方法はサポートされていません。

コードを見ると、ModelAdmin.list_display_links何も設定しなければ自動的に最初の要素に設定されているようです。したがって、最も簡単な方法は、サブクラスの__init__メソッドをオーバーライドして、初期化時にその属性の設定を解除することです。ModelAdmin

class HitAdmin(admin.ModelAdmin):
    list_display = ('user','ip','user_agent','hitcount')
    search_fields = ('ip','user_agent')
    date_hierarchy = 'created'

    def __init__(self, *args, **kwargs):
        super(HitAdmin, self).__init__(*args, **kwargs)
        self.list_display_links = []

非常に大まかなテストの後、これはうまくいくようです。ただし、他の場所で問題が発生しないこと、または Django への将来の変更によって問題が発生しないことを保証することはできません。

コメントの後に編集:

ソースにパッチを当てる必要はありません。これでうまくいきます:

    def __init__(self, *args, **kwargs):
        if self.list_display_links:
            unset_list_display = True
        else:
            unset_list_display = False
        super(HitAdmin, self).__init__(*args, **kwargs)
        if unset_list_display:
            self.list_display_links = []

しかし、パッチが Django に受け入れられるとはとても思えません。なぜなら、これは現時点でコードが明示的に行っている何かを壊してしまうからです。

于 2009-10-24T21:03:27.640 に答える
1

django 1.6.2 では、次のようにできます。

class MyAdmin(admin.ModelAdmin):

    def get_list_display_links(self, request, list_display):
        return []

自動生成されたすべてのリンクが非表示になります。

于 2014-02-21T02:16:11.797 に答える
1

また、ばかげてハックすることもできます (オーバーライドに大騒ぎしたくない場合init) と、基本的に次のように見える最初の要素に値を提供します。

</a>My non-linked value<a>

あまりきれいではありませんが、マークアップを変更するだけなので、他の場所で何かを壊す心配はおそらく少ないでしょう。

これがどのように機能するかについてのサンプルコードを次に示します。

class HitAdmin(admin.ModelAdmin):
    list_display = ('user_no_link','ip','user_agent','hitcount')

    def user_no_link(self, obj):
        return u'</a>%s<a>' % obj
    user_no_link.allow_tags = True
    user_no_link.short_description = "user"

return u'%s' % obj.get_full_name()サイドノート:ユースケースによってはちょっとすっきりするかもしれませんが、返すことで(リンクにしたくないので)出力の読みやすさを向上させることもできます。

于 2009-10-24T21:26:40.630 に答える
0

@simpleigh のソリューションに基づいて mixin を構築します。

class DeactivatableChangeViewAdminMixin:
    """
    Mixin to be used in model admins to disable the detail page / change view.
    """
    enable_change_view = True

    def can_see_change_view(self, request) -> bool:
        """
        This method determines if the change view is disabled or visible.
        """
        return self.enable_change_view

    def get_list_display_links(self, request, list_display):
        """
        When we don't want to show the change view, there is no need for having a link to it
        """
        if not self.can_see_change_view(request=request):
            return None
        return super().get_list_display_links(request, list_display)

    def change_view(self, request, *args, **kwargs):
        """
        The 'change' admin view for this model.

        We override this to redirect back to the changelist unless the view is
        specifically enabled by the "enable_change_view" property.
        """
        if self.can_see_change_view(request=request):
            return super().change_view(request, *args, **kwargs)
        else:
            opts = self.model._meta
            url = reverse('admin:{app}_{model}_changelist'.format(
                app=opts.app_label,
                model=opts.model_name,
            ))
            return HttpResponseRedirect(url)

利点は、それを再利用でき、さらに条件付きにすることができることです

django 3.2.8 用にビルドします。

静的アプローチでこのように使用するには:

class MyAdmin(DeactivatableChangeViewAdminMixin, admin.ModelAdmin):
  enable_change_view = False

非静的なものの場合は次のようになります。

class MyAdmin(DeactivatableChangeViewAdminMixin, admin.ModelAdmin):  
    def can_see_change_view(self, request) -> bool:
        return request.user.my_condition
于 2021-10-06T06:48:26.610 に答える
0

get_list_display_links メソッドとアクションを None にオーバーライドしました。

class ChangeLogAdmin(admin.ModelAdmin):
    actions = None
    list_display = ('asset', 'field', 'before_value', 'after_value', 'operator', 'made_at')

    fieldsets = [
        (None, {'fields': ()}),
    ]

    def __init__(self, model, admin_site):
        super().__init__(model, admin_site)

    def get_list_display_links(self, request, list_display):
        super().get_list_display_links(request, list_display)
        return None
于 2020-02-23T10:14:22.760 に答える