排除字段但仍提供默认值

时间:2015-08-25 19:03:13

标签: python django django-admin

我希望能够在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) 字段正确显示,预选当前用户
  • 由于任何其他工作人员允许创建authorNews字段将被隐藏,但在提交表单时会引发异常:
  

/ admin / news / news / add /

中的IntegrityError      

列'author_id'不能为空

如何隐藏author字段并仍提供author

2 个答案:

答案 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)