排除字段但仍提供默认值

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)

这是它的作用:

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)