保存创建模型实例的用户

时间:2015-07-29 15:02:41

标签: python django

我的Django项目中有一个名为Event的模型:

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


class Event(models.Model):
    organizer = models.CharField(blank=False, max_length=200) # TODO
    author = models.ForeignKey(User)

此模型还附有表格:

来自django导入表单 来自.models导入事件

class EventForm(forms.ModelForm):
    class Meta:
        model = Event
        fields = ['organizer',
                  ]

(还有其他领域,但它们无关紧要)

如果我想自动填充author字段,最佳做法是什么?目前,保存模型的视图将保存它:

def event_created(request):
    form = EventForm(request.POST)
    if form.is_valid():
        obj = form.save(commit=False)
        obj.author = request.user
        obj.save()

这个有效,但我担心,因为这意味着当其他一些视图保存时,它必须跳过同一个循环。有没有办法告诉模型本身“当我保存你,将用户设置为当前用户”?问题是该模型不知道哪个请求正在触发其保存,如果我从视图中提供请求,那么再次看起来像代码重复......

2 个答案:

答案 0 :(得分:2)

一种方法是将request对象传递给EventForm并使用此request对象在保存时获取用户。

您可以通过EventForm(request.POST, request=request)创建表单实例来完成此操作。

class EventForm(forms.ModelForm):

   def __init__(self, *args, **kwargs):
       self.request = kwargs.pop('request', None) # set 'request' if passed as kwarg
       return super(EventForm, self).__init__(*args, **kwargs)

然后,在表单的save()方法中,您可以将author视图中保存event_created的逻辑移到它。

但为此,您必须确保在创建表单实例时每次都传递request,以便将author设置为request.user

我会建议你正在做的原始方法因为它整洁干净。您不必担心每次都会传递request并覆盖__init__()方法和save() EventForm方法。

答案 1 :(得分:1)

有一个类似的问题已经回答here

基本上,该模型可以在更多只是视图的地方创建和更新(管理命令和帖子保存监听器)。在这些情况下,我们不会要求更新用户是谁。