排除字段但仍提供默认值
Exclude fields but still provide a default value
我希望能够在 Django 管理中隐藏表单中的字段(我使用的是 Django 1.7),但仍提供默认值(绑定到 request
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
,author
字段被隐藏,但是当提交表单时会引发异常:
IntegrityError at /admin/news/news/add/
Column 'author_id' cannot be null
如何隐藏 author
字段并仍然提供 author_id
?
您可以将其设置为只读,而不是排除该字段,这样它仍会向用户显示,但他们无法更改它:
self.readonly_fields = ('author',)
我终于找到了如何通过组合我重写的两种方法来实现我想做的事情。
这里是 get_form
方法,现在将 author
字段显示为只读而不是将其排除(感谢 )。此更改仅用于编辑目的(参见 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)
我希望能够在 Django 管理中隐藏表单中的字段(我使用的是 Django 1.7),但仍提供默认值(绑定到 request
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
,author
字段被隐藏,但是当提交表单时会引发异常:
IntegrityError at /admin/news/news/add/
Column 'author_id' cannot be null
如何隐藏 author
字段并仍然提供 author_id
?
您可以将其设置为只读,而不是排除该字段,这样它仍会向用户显示,但他们无法更改它:
self.readonly_fields = ('author',)
我终于找到了如何通过组合我重写的两种方法来实现我想做的事情。
这里是 get_form
方法,现在将 author
字段显示为只读而不是将其排除(感谢 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)