我的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()
这个有效,但我担心,因为这意味着当其他一些视图保存时,它必须跳过同一个循环。有没有办法告诉模型本身“当我保存你,将用户设置为当前用户”?问题是该模型不知道哪个请求正在触发其保存,如果我从视图中提供请求,那么再次看起来像代码重复......
答案 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。
基本上,该模型可以在更多只是视图的地方创建和更新(管理命令和帖子保存监听器)。在这些情况下,我们不会要求更新用户是谁。