【问题标题】:Django3.0 add request.user to form requestDjango3.0添加request.user表单请求
【发布时间】:2020-04-29 15:48:31
【问题描述】:

假设我们有这个模型:

class Creation(models.Model):
    title = models.CharField(max_length=DEFAULT_LENGTH)
    url = models.CharField(max_length=DEFAULT_LENGTH)    
    date = models.DateTimeField('date published', default=datetime.date.today)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)

    def __str__(self):
        return self.title

让我们使用这个视图:

def submit(request):
    FormSet = modelformset_factory(Creation, fields=('title', 'url'))
    if request.method == 'POST':
        formset = FormSet(request.POST, request.FILES)
        if formset.is_valid():
           obj = formset.save(commit=False)
            obj.author = request.user
            obj.save()
    else:
        formset = FormSet
    return render(request, 'app/submit.html', {'formset': formset})

保存 formsetobj 并添加 request.user 并将其提交到数据库。 这不起作用,因为现在 django 会抛出一个错误,上面写着

'list' 对象没有属性'author'

这很有意义,因为上面的字段列表中没有author但是如果我将“作者”添加到fields,则会在通过{{formset}} 呈现模板时显示另一个选择框。 也许我可以编写自己的模板代码而不是使用{{formset}}并省略作者,但我觉得Django3.0必须有更优雅的方式。有吗?

我要做的就是让外键author(见上面的模型)填充登录用户。

【问题讨论】:

    标签: python-3.x forms model django-3.0


    【解决方案1】:

    原来modelformset_factory(..) 有问题。

    如果您在models.py 中使用正确的CreationForm

    class CreationForm(ModelForm):
        class Meta:
            model = Creation
            fields = ['title', 'url']
    

    并在您的views.py 中使用它:

    formset = CreationForm(request.POST)
        if request.method == 'POST':
            if formset.is_valid():
                f = formset.save(commit=False)
                f.author = request.user
                f.save()
    

    它有效。

    【讨论】:

      猜你喜欢
      • 2011-04-09
      • 2011-04-01
      • 2016-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 2021-01-16
      • 1970-01-01
      相关资源
      最近更新 更多