我正在开发一个消息系统,我想根据当前登录的用户设置消息的发起者。
class Message(models.Model):
originator = models.ForeignKey(User, related_name='+')
destination = models.ForeignKey(User, related_name='+')
subject = models.CharField(max_length=100)
content = models.TextField()
我使用 ModelForm 和 CreateView 来表示:
class MessageForm(forms.ModelForm):
class Meta:
model = Message
fields = ('destination', 'subject', 'content')
所以在保存这个表格之前,
originator
需要设置为当前登录的用户。我不认为覆盖 save
模型的方法在这里很合适,所以我打算在表单的save
中做方法,但是我无权访问请求变量。在 another CreateView post建议是覆盖 get_form_kwargs
方法:class MyFormView(FormView):
def get_form_kwargs(self):
# pass "user" keyword argument with the current user to your form
kwargs = super(MyFormView, self).get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
但是这不起作用,因为您实际上无法通过 kwarg
user
到 ModelForm,因为 ModelForm 不接受自定义参数。更新
originator
的最佳(最干净和最实用)方法是什么?变量与用户信息?
最佳答案
在与 yuji-tomita-tomita 的讨论中他提出了以下建议,我想分享一下:
第一种方法依赖他的原始代码,发送一个user
kwarg 到表单 get_form_kwargs
,然后您必须修改类似于以下内容的表单模型:
class MyModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.user = self.kwargs.pop('user', None)
super(MyModelForm, self).__init__(*args, **kwargs)
原来如此
__init__
函数获取它期望的参数。但他建议的首选方法是:
class MyView(CreateView):
def form_valid(self, form):
obj = form.save(commit=False)
obj.user = self.request.user
obj.save()
return super(MyView, self).form_valid(form)
这真的很好用。当
form.save(commit=False)
方法执行它填充 self.instance
在具有相同模型实例的表单对象中,它返回到我们的变量 obj
.更新时 obj
通过执行 obj.user = self.request.user
并保存它,form
对象引用了这个完全相同的对象,因此 form
这里的对象已经完成了。当你传给原来的form_valid
CreateView
的方法,它拥有所有数据并将成功插入到数据库中。如果有人有不同的方式来做这件事,我很想听听!
关于django - 使用 CreateView 将请求变量传递给模型的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14391036/