使模型中的用户默认为当前用户

16 投票
6 回答
29514 浏览
提问于 2025-04-16 09:50

我有以下内容:

from django.contrib.auth.models import User

class ClientDetails(models.Model):
    created_by = models.ForeignKey(User)
    ...

我该怎么做才能让 created_by 默认设置为当前登录的用户呢?

(我想这样做主要是为了在管理员视图中隐藏这个字段,同时也因为每次保存实例时我不想每次都填这个)

6 个回答

6

我最近遇到了类似的问题,这段代码来自我的views.py文件

def CircleAdd(request):

    form = CircleAddForm(request.POST)

    if form.is_valid():

        Circle = form.save(commit=False)
        Circle.Author = request.user
        Circle = Circle.save()

然后我为'circles'模型创建了一个表单,其实这个表单只是个包装而已(forms.py)

class CircleAddForm(ModelForm):
    class Meta:
        model = Circle

记得在你的视图里导入这个表单哦!

补充一下:我甚至不确定你是否真的需要单独的表单,关键在于先做一个假的提交,然后再进行真正的提交。

15

你需要在你的模型管理类中,也就是在admin.py文件里,重写一下get_changeform_initial_data这个方法,具体做法如下:

# admin.py

class ClientDetailsAdmin(admin.ModelAdmin):
    def get_changeform_initial_data(self, request):
        get_data = super(ClientDetailsAdmin, self).get_changeform_initial_data(request)
        get_data['created_by'] = request.user.pk
        return get_data

admin.site.register(ClientDetails, ClientDetailsAdmin)

这样做可以得到最优雅的解决方案,因为在你创建新记录的时候,created_by这个字段会自动填上。

19

因为你需要从一个 request 对象中获取当前登录的用户,所以你不能在模型的 save 方法里直接获取这个用户。不过,你可以重写模型管理器的 save_model 方法来实现这个功能。

class MyAdmin(admin.ModelAdmin):
    def save_model(self, request, instance, form, change):
        user = request.user 
        instance = form.save(commit=False)
        if not change or not instance.created_by:
            instance.created_by = user
        instance.modified_by = user
        instance.save()
        form.save_m2m()
        return instance

撰写回答