使模型中的用户默认为当前用户
我有以下内容:
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