django - 使用 CreateView 将请求变量传递给模型的最佳方法是什么

标签 django django-forms

我正在开发一个消息系统,我想根据当前登录的用户设置消息的发起者。

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/

相关文章:

python - 将 Django 中的 DateTimeField 转换为 Unix 时间

javascript - 如何将日期/日历小部件添加到 django 表单?

django - 在 Django 表单上初始填充

Django formset_factory vs modelformset_factory vs inlineformset_factory

django - 让 django url 标签静默失败

python - Django 错误地期望 id 列

python - Django URL 调度程序示例 - 将 url 从 View 传递到另一个 View

python - 如何按 Django 中用户配置文件的属性过滤查询?

django - 如何使用 FileFields 限制 ModelForms 文件上传的文件类型?

python - 如何在 forms.Form 子类上动态设置 models.ModelChoiceField 的查询集