Sev*_*ths 8 python django django-models django-admin
我有以下内容:
from django.contrib.auth.models import User
class ClientDetails(models.Model):
created_by = models.ForeignKey(User)
...
Run Code Online (Sandbox Code Playgroud)
如何created_by
对当前登录的用户进行默认设置?
(我想这样做,所以我可以在管理视图中隐藏它,但也因为当我保存一个实例时我不想每次都填充它)
Ber*_*ant 15
由于您需要从request
对象中获取当前登录的用户,因此您无法在模型的save
-method中获取它,但您可以例如覆盖模型admin的save_model
-method:
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
Run Code Online (Sandbox Code Playgroud)
您必须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)
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以获得最优雅的解决方案,因为在created_by
创建新记录时会提交字段.
我最近遇到过类似的问题,这是来自我的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()
Run Code Online (Sandbox Code Playgroud)
然后我有一个'圆圈'模型的表单,它只是一个包装器(forms.py)
class CircleAddForm(ModelForm):
class Meta:
model = Circle
Run Code Online (Sandbox Code Playgroud)
请记住在视图中导入表单!
编辑:甚至不确定你是否需要打扰单独的表单,关键位是假提交,其次是真实
基于已接受的答案,如果您希望使用基于类的视图执行此操作,您可以按照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)
Run Code Online (Sandbox Code Playgroud)