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语法。使用Py3super()
语法,此混合更易于对任何模型重用,因为您不需要将类名作为属性包含在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