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

时间:2011-01-12 15:50:18

标签: python django django-models django-admin

我有以下内容:

from django.contrib.auth.models import User

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

如何使created_by默认为当前登录的用户?

(我想这样做,所以我可以在管理视图中隐藏它,但也因为当我保存一个实例时我不想每次都填写它)

6 个答案:

答案 0 :(得分:15)

由于您需要从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

答案 1 :(得分: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()

然后我有一个'圆圈'模型的表单,它只是一个包装器(forms.py)

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

请记住在视图中导入表单!

编辑:甚至不确定你是否需要打扰单独的表单,关键位是假提交,其次是真正的

答案 2 :(得分:6)

您必须在get_changeform_initial_data中的模型Admin类中覆盖admin.py方法,如下所示:

# 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字段。

答案 3 :(得分:3)

根据已接受的答案,如果您希望使用基于类的视图执行此操作,则可以按照docs中的说明操作,覆盖类视图上的form_valid()方法:

# views.py

from django.views.generic.edit import CreateView

class CreateClient(CreateView):
    def form_valid(self, form):
        form.instance.created_by = self.request.user
        return super(CreateClient, self).form_valid(form)

答案 4 :(得分:2)

普通的modelfields有一个默认参数。但是就我所知,ForeignKeys并没有这么做,所以我猜你需要使用post_save信号。

答案 5 :(得分:1)

我找到了:

from django.db import models
from django.contrib.auth.models import User

class CurrentUserField(models.ForeignKey):
    def __init__(self, **kwargs):
        super(CurrentUserField, self).__init__(User, null=True, **kwargs)

    def contribute_to_class(self, cls, name):
        super(CurrentUserField, self).contribute_to_class(cls, name)
        registry = registration.FieldRegistry()
        registry.add_field(cls, self)

class ClientDetails(models.Model):
    created_by = CurrentUserField()
...
来自here

。但是不是有更简单的方法吗?