我希望能够在Django管理员中隐藏一个表单中的字段(我正在使用Django 1.7),但仍然提供一个默认值(它与request
绑定,因为它是{{ 1}})。
以下是我request.user
的内容:
admin.py
这就是它的作用:
from django.contrib import admin
from .models import News
class NewsAdmin(admin.ModelAdmin):
list_display = ('title', 'category', 'pub_date', 'visible',)
list_filter = ('visible', 'enable_comments', 'category__topic', 'category__site', 'category',)
search_fields = ['title']
def get_form(self, request, obj=None, **kwargs):
if not request.user.is_superuser:
self.exclude = ('author',)
return super(NewsAdmin, self).get_form(request, obj, **kwargs)
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'author':
kwargs['initial'] = request.user.id
return super(NewsAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
admin.site.register(News, NewsAdmin)
字段正确显示,预选当前用户author
,News
字段将被隐藏,但在提交表单时会引发异常:/ admin / news / news / add /
中的IntegrityError列'author_id'不能为空
如何隐藏author
字段并仍提供author
?
答案 0 :(得分:1)
您可以将其设置为只读,而不是排除字段,以便它仍会显示给用户,但它们无法更改:
self.readonly_fields = ('author',)
答案 1 :(得分:1)
我终于找到了如何使用我覆盖的两种方法的组合来实现我想要做的事情。
这是get_form
方法,现在将author
字段显示为只读而不是排除它(感谢this answer)。这是一项仅用于编辑目的的更改(请参阅obj is not None
),以防止在编辑他人新闻时发生意外异常。
def get_form(self, request, obj=None, **kwargs):
if not request.user.is_superuser and obj is not None:
self.readonly_fields = ('author',)
return super(NewsAdmin, self).get_form(request, obj, **kwargs)
这是formfield_for_foreignkey
方法。它只是过滤QuerySet
以仅允许一个用户。
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'author':
kwargs['initial'] = request.user.id
kwargs['queryset'] = User.objects.filter(pk=request.user.id)
return super(NewsAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)