在Django管理后台中获取当前用户

3
我有一个帖子对象,可以在网站或管理面板中访问。在两种情况下,用户发布帖子时,将自动分配给帖子。在网站区域中,它正常工作。然而,在管理员区域中却不起作用。首先,我尝试只在那里放置表单输入。当我试图保存对象并留空输入时,它告诉我该表单没有值。然后,我试图看看是否只是随意输入一个值进行测试,看它是否被覆盖。但是,这个随机值没有被当前用户覆盖。如果我排除该字段,则在尝试保存模型时,我会收到完整性错误,指出作者字段“可能不为NULL”,因此我假设我的save_model()函数根本没有启动。现在,我在使用此代码时在互联网上看到过很多,人们声称它有效,我不知道它现在是不是已经失效了。下面是我的代码:
from django.contrib import admin
from posting.models import Posting, Categories

class PostingAdmin(admin.ModelAdmin):
    list_display = ("title","author", "article","date")
    exclude = ('author',)
    fieldsets = (
        (None, {
            'fields': ('title',)
        }),
        ('Body', {
            'fields': ('article',)
            }),
    )

    def save_model(self,request,form,obj,change):
        print 'ENTERING SAVE_MODEL FUNCTION'
        if not change:
            obj.author = request.user
            print 'OBJ.AUTHOR:' + str(obj.author)
        obj.save()
        print "EXITING SAVE_MODEL FUNCTION"
admin.site.register(Posting, PostingAdmin)
4个回答

3

我只是提供信息,因为我遇到了类似的问题,所以深入研究了这篇文章...
要在Django 1.11中从“请求”数据预填充管理员字段,请参见下面的示例,其中模型的“用户”字段被预填充为已登录的用户:

admin.py

class PostingAdmin(admin.ModelAdmin):

  def get_changeform_initial_data(self, request):
    return {'user': request.user}

在首次保存“发布管理员”(模型实例)之前,此操作将填充字段。


这很简单而且很棒!现在是2020年,它正在运行! - Martins
这确实很方便,但我注意到它不适用于现有的模型实例。这可能不是问题,但如果是的话,覆盖get_form是解决方法。 - alstr

2
你可以通过将请求添加为新创建的表单类的属性,覆盖ModelAdmin.get_form。
class EntryAdmin(admin.ModelAdmin):
    form = EntryAdminForm

    def get_form(self, request, *args, **kwargs):
        form = super(EntryAdmin, self).get_form(request, *args, **kwargs)
        form.request = request
        return form

0

我知道我有点晚发布这个解决方案,但如果其他人像我一样遇到了问题,可以尝试:

def save_model(self, request, obj, form, change):
    if getattr(obj, 'author', None) is None:
        obj.author = request.user
    obj.save()

0
这对我有效:
from django.contrib import admin
from page.models import Page

class PageAdmin(admin.ModelAdmin):
    def get_form(self, request, *args, **kwargs):
        form = super(PageAdmin, self).get_form(request, *args, **kwargs)
        form.base_fields['author'].initial = request.user
        return form

admin.site.register(Page, PageAdmin)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接