【问题标题】:Disable form field in Django's CreateView在 Django CreateView 中禁用表单字段
【发布时间】:2017-05-04 11:17:29
【问题描述】:

这个问题也可以表述为:“如何更改 CreateView 生成的表单的属性?”

我正在使用“CreateView”在 Django 1.10 中生成视图和相关表单。这个想法是普通用户(教师)只能以他/她自己的身份创建模型的实例,但特权用户可以创建实例并分配给任何教师。我想对两者使用相同的视图/表单。

型号:

class Set(models.Model):
    name = models.CharField(
        max_length=40,
    )
    matter = models.ForeignKey(
        Matter,
        on_delete=models.SET_NULL,
        null=True,
    )
    group = models.ForeignKey(
        Group,
        on_delete=models.SET_NULL,
        null=True,
    )
    teacher = models.ForeignKey(
        Teacher,
        on_delete=models.PROTECT,
    )

从技术上讲,它将包括使用当前登录的“老师”填充表单并禁用该字段,除非当前用户具有特权。我目前用下面的代码做初始值设置,但是不知道如何防止普通用户修改“teacher”字段。

class SetCreate(LoginRequiredMixin, CreateView):
    model = Set
    fields = ('name', 'matter', 'group', 'teacher')

    def get_initial(self):
        return {'teacher': self.request.user.teacher.id}

    # code to limit 'teacher' field editing

我尝试的另一个选择是使用正确的“老师”创建实例,例如:

class SetCreate(LoginRequiredMixin, CreateView):
    model = Set
    fields = ('name', 'matter', 'group')

    def form_valid(self, form):
        form.instance.teacher = self.request.user.teacher
        return super(SetCreate, self).form_valid(form)

它很好用,但我不能用它来编辑特权用户的“教师”字段。

我知道表单字段存在“Field.disable”属性,但如果可能的话,我不知道如何更改“CreateView”生成表单的属性。

另一种选择是限制表单中下拉列表中的选项,但我也不知道该怎么做。

欢迎任何建议,包括不同的观点。

【问题讨论】:

    标签: django django-forms django-class-based-views django-generic-views


    【解决方案1】:

    查看代码,编辑视图根据fields 属性的值在get_form_class 内生成一个表单。这被定义为一个类属性,但代码实际上是通过self.fields 引用它,所以没有理由不能在实例级别覆盖它。所以,你可以这样做:

    class SetCreate(LoginRequiredMixin, CreateView):
        model = Set
        fields = ('name', 'matter', 'group')
    
        def get_form_class(self, *args, **kwargs):
            if self.request.user.has_the_right_permission():
                self.fields += ('teacher',)
            else:
                self.fields = self.fields
            return super(SetCreate, self).get_form_kwargs(*args, **kwargs)
    

    (看似毫无意义的 else 块是为了确保我们始终设置实例变量。)

    【讨论】:

    • 看起来不错,但它只对编辑表单有用,而不是创建表单。在创建模式下,普通用户实际上会定义一个“教师”字段,但仅限于他自己。理想情况下,可以通过在生成表单时在“教师”字段中设置“禁用”属性来解决,但我不知道要覆盖什么方法来做到这一点。
    • 您可以使用上面显示的form_valid 代码来执行此操作,同样位于检查权限的 if 块中。
    猜你喜欢
    • 2019-11-17
    • 2013-10-21
    • 2020-12-15
    • 2017-07-11
    • 2017-03-21
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    相关资源
    最近更新 更多