2011-01-12 26 views
6

我有以下几点:使模型默认用户当前用户

from django.contrib.auth.models import User 

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

我如何created_by默认在当前登录用户的?

(我想这样做,所以我可以在管理视图中隐藏它主要也是因为当我保存的情况下,我不希望每次都加油吧)

回答

12

,因为你需要从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

普通modelfields有默认参数。但ForeignKeys并不如我所知,所以我想你需要使用post_save信号。

+0

+1,但如果是我,我只会覆盖save()函数:) – mouad 2011-01-12 16:00:12

+0

然后我将不得不重写管理员默认的保存功能不是吗? – Sevenearths 2011-01-12 16:10:51

+0

当前版本的Django肯定允许外键的默认值。我不确定他们没有。因此,如果有人今天过来阅读这个答复,那么最好应该考虑过时。 – 2014-10-10 19:39:01

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。但是有没有更简单的方法?

+0

+我不知道如何导入`注册` – Sevenearths 2011-01-12 16:35:01

+0

你应该进一步阅读这本书,还有更多的需要,包括注册和中间件! – 2011-01-12 17:56:03

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 

请记得在您的视图中导入表格!

编辑:即使不知道,如果你甚至需要用不同的形式来打扰,关键位是假的承诺,其次是真正

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

你必须重写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字段。

相关问题