Python 可更改为ModelAdmin,例如建议的unset\u list\u display\u链接[True/False],然后他们可以在同一语句中检查列表显示链接。。。再一次,他们可能只是建议你用你的方式覆盖它。仔细检查后,我注意到链接现在被添加到选择框中-因

Python 可更改为ModelAdmin,例如建议的unset\u list\u display\u链接[True/False],然后他们可以在同一语句中检查列表显示链接。。。再一次,他们可能只是建议你用你的方式覆盖它。仔细检查后,我注意到链接现在被添加到选择框中-因,python,django,django-admin,modeladmin,Python,Django,Django Admin,Modeladmin,可更改为ModelAdmin,例如建议的unset\u list\u display\u链接[True/False],然后他们可以在同一语句中检查列表显示链接。。。再一次,他们可能只是建议你用你的方式覆盖它。仔细检查后,我注意到链接现在被添加到选择框中-因此,当你选择一个项目时,它会打开页面!这是Django(有时令人恼火)管理政策的一部分:应该信任用户。因此,没有内置的方式来限制对用户本来可以访问的内容的访问。一个补丁无疑会被拒绝,但仍然有办法解决。这也是一个有趣的方法——虽然上面的\uuuu



可更改为
ModelAdmin
,例如建议的
unset\u list\u display\u链接
[True/False],然后他们可以在同一
语句中检查
列表显示链接
。。。再一次,他们可能只是建议你用你的方式覆盖它。仔细检查后,我注意到链接现在被添加到选择框中-因此,当你选择一个项目时,它会打开页面!这是Django(有时令人恼火)管理政策的一部分:应该信任用户。因此,没有内置的方式来限制对用户本来可以访问的内容的访问。一个补丁无疑会被拒绝,但仍然有办法解决。这也是一个有趣的方法——虽然上面的
\uuuu init\uuuu
策略可能会破坏它,但它似乎更直观一些。。。但无论如何,这给了我一些想法。谢谢。嗯-我正在使用主干,我在尝试时遇到了一个
TypeError:getattr():属性名必须是string[02/Nov/2009 12:05:22]“get/admin/HTTP/1.1”500 2524
错误。有趣,嗯,有趣。我刚刚检查了我正在做的项目,它实际上运行的是1.1(r11602)。我刚刚尝试将我的项目升级到主干(r11706),但它似乎仍然可以正常工作。然而,我确实有一些其他的管理工作正在进行(您可以在这里看到详细信息),例如,我的ModelAdmin的list\u display\u links设置为(None,)实际上不在我的admin.py中。。。然而,我不明白为什么这会使事情有所不同。奇怪的是,你的工作正常;不知道有什么不同。。。但是,我每次都能找到那行代码。Wierd.如果你注释掉ModelAdmin中的其他设置,然后就这样做了,会发生什么呢?我已经用一个完全空的ModelAdmin尝试过了,只得到了:
list\u display\u links=(None,)
,但仍然得到相同的TypeError。。。不过,如果它对你有效,我觉得我一定做错了什么。刚刚找到你的帖子,这也对我有效(设置
self.list\u diplay\u links=(无)
\uuuu init\uuuu
中。谢谢!没有一个答案提供了一种实际禁止更改日志条目的方法。虽然用户没有看到链接,但他可以通过键入编辑表单的url访问编辑表单,并可以更改条目。用户必须具有“can\u change”权限才能查看更改列表视图。这引入了一个serIOU安全漏洞。@omat:如果有人试图手动进入变更列表页面,您可以覆盖ModelAdmin.change\u视图重定向到变更列表页面,或者任何您喜欢的地方。我将在下面提供一个示例。此解决方案只是破解问题本身!不幸的是,这在Django 2.2中似乎不起作用。现在Django给出了您的答案u错误
“list\u display\u links[0]”的值指的是“None”,它未在“list\u display”中定义。
+1用于此方法,因为它允许在强制执行“ban”之前与
请求
对象交互例如,我们可以基于
请求.user
甚至
请求.session
来实现限制。这使得复选框成为一个链接。在Django 1.11中,
列表显示链接=None
禁用显示链接。在Django 2.0中,只需使用:列表显示链接=None只是未来读者的注意事项:
超级()
此答案中使用的语法是Py2语法。使用Py3
super()
语法,此混合更易于对任何模型重用,因为您不需要将类名作为属性包含在
super()
调用中,它只是
super()。更改视图(…)
。这真的需要澄清一下!这与2017年8月的@sam评论相同。
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
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 = []
    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 = []
</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"
list_display_links = (None,)
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, )
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'))
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)
class MyAdmin(admin.ModelAdmin):

    def get_list_display_links(self, request, list_display):
        return []
class HitAdmin(admin.ModelAdmin):
    list_display_links = None
class ReadOnlyMixin(): # Add inheritance from "object" if using Python 2
    list_display_links = None
def get_list_display_links(self, request, list_display):
    """
    Return a sequence containing the fields to be displayed as links
    on the changelist. The list_display parameter is the list of fields
    returned by get_list_display().

    We override Django's default implementation to specify no links unless
    these are explicitly set.
    """
    if self.list_display_links or not list_display:
        return self.list_display_links
    else:
        return (None,)
enable_change_view = False

def change_view(self, request, object_id, form_url='', extra_context=None):
    """
    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.enable_change_view:
        return super(ReportMixin, self).change_view(
            request,
            object_id,
            form_url,
            extra_context
        )
    else:
        from django.core.urlresolvers import reverse
        from django.http import HttpResponseRedirect

        opts = self.model._meta
        url = reverse('admin:{app}_{model}_changelist'.format(
            app=opts.app_label,
            model=opts.model_name,
        ))
        return HttpResponseRedirect(url)
def has_add_permission(self, request):
    return False

def has_delete_permission(self, request, obj=None):
    return False
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect

class ReadOnlyMixin(): # Add inheritance from "object" if using Python 2

    actions = None

    enable_change_view = False

    def get_list_display_links(self, request, list_display):
        """
        Return a sequence containing the fields to be displayed as links
        on the changelist. The list_display parameter is the list of fields
        returned by get_list_display().

        We override Django's default implementation to specify no links unless
        these are explicitly set.
        """
        if self.list_display_links or not list_display:
            return self.list_display_links
        else:
            return (None,)

    def change_view(self, request, object_id, form_url='', extra_context=None):
        """
        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.enable_change_view:
            return super(ReportMixin, self).change_view(
                request,
                object_id,
                form_url,
                extra_context
            )
        else:
            opts = self.model._meta
            url = reverse('admin:{app}_{model}_changelist'.format(
                app=opts.app_label,
                model=opts.model_name,
            ))
            return HttpResponseRedirect(url)

    def has_add_permission(self, request):
        return False

    def has_delete_permission(self, request, obj=None):
        return False
@admin.register(Object)
class Admin(admin.ModelAdmin):

    def has_add_permission(self, request):
        return False

    def has_change_permission(self, request, obj=None):
        return False

    def has_delete_permission(self, request, obj=None):
        return False
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