【问题标题】:Limit Django ModelForm ForeignKey choices depending on request.user根据 request.user 限制 Django ModelForm ForeignKey 选择
【发布时间】:2022-01-20 18:26:29
【问题描述】:

有时需要限制ModelFormForeignKey 字段提供的选项,以便用户看不到彼此的内容。但是,这可能会很棘手,因为模型无法访问 request.user

考虑一个有两个模型的应用:

class Folder(models.Model):
    user = models.ForeignKey(get_user_model(), editable=False, on_delete=models.CASCADE)
    name = models.CharField(max_length=30)

class Content(models.Model):
    folder = models.ForeignKey(Folder, on_delete=models.CASCADE)
    text = models.CharField(max_length=50)

这个想法是用户可以创建文件夹和内容,但只能将内容存储在他们自己创建的文件夹中。

即:

Content.folder.user == request.user

问题:我们如何使用例如CreateView,以便在创建新内容时仅向用户显示他们自己的文件夹的选择?

【问题讨论】:

    标签: django django-forms django-authentication django-generic-views


    【解决方案1】:

    我通过覆盖CreateView.get_form_class() 来做到这一点,以便在将表单的相关字段传递给视图的其余部分之前修改它的属性。

    默认方法,继承自views.generic.edit.ModelFormMixin,返回一个ModelForm,表示base_fields字典中模型的所有可编辑字段。因此,这是进行任何所需更改的好地方,还可以访问self.request.user

    所以对于上面的例子,在views.py中我们可能会说:

    class ContentCreateView(LoginRequiredMixin, CreateView):
        model = Content
        fields = '__all__'
    
        def get_form_class(self):
            modelform = super().get_form_class()
            modelform.base_fields['folder'].limit_choices_to = {'user': self.request.user}
            return modelform
    

    docs 中阅读有关ForeignKey.limit_choices_to 的更多信息。

    请注意,字段选择是由表单验证强制执行的,因此这应该非常可靠。

    【讨论】:

      猜你喜欢
      • 2020-01-14
      • 2012-10-16
      • 2010-09-22
      • 2014-06-30
      • 2017-07-26
      • 2018-02-25
      • 2014-12-10
      相关资源
      最近更新 更多