我有以下几点:使模型默认用户当前用户
from django.contrib.auth.models import User
class ClientDetails(models.Model):
created_by = models.ForeignKey(User)
...
我如何created_by
默认在当前登录用户的?
(我想这样做,所以我可以在管理视图中隐藏它主要也是因为当我保存的情况下,我不希望每次都加油吧)
我有以下几点:使模型默认用户当前用户
from django.contrib.auth.models import User
class ClientDetails(models.Model):
created_by = models.ForeignKey(User)
...
我如何created_by
默认在当前登录用户的?
(我想这样做,所以我可以在管理视图中隐藏它主要也是因为当我保存的情况下,我不希望每次都加油吧)
,因为你需要从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
普通modelfields有默认参数。但ForeignKeys并不如我所知,所以我想你需要使用post_save信号。
我发现:
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。但是有没有更简单的方法?
+我不知道如何导入`注册` – Sevenearths 2011-01-12 16:35:01
你应该进一步阅读这本书,还有更多的需要,包括注册和中间件! – 2011-01-12 17:56:03
我最近类似的问题,这是从我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
请记得在您的视图中导入表格!
编辑:即使不知道,如果你甚至需要用不同的形式来打扰,关键位是假的承诺,其次是真正
大厦接受的答案,如果你正在寻找这样做与基于类的意见,你可以按照在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)
你必须重写get_changeform_initial_data
方法在模型管理类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
字段。
+1,但如果是我,我只会覆盖save()函数:) – mouad 2011-01-12 16:00:12
然后我将不得不重写管理员默认的保存功能不是吗? – Sevenearths 2011-01-12 16:10:51
当前版本的Django肯定允许外键的默认值。我不确定他们没有。因此,如果有人今天过来阅读这个答复,那么最好应该考虑过时。 – 2014-10-10 19:39:01