django - 禁用 Django 的 CreateView 中的表单字段

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

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

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

型号:

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,
    )

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

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”生成表单的属性(如果可能)。

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

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

最佳答案

查看代码,编辑 View 根据 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 block 是为了确保我们始终设置实例变量。)

关于django - 禁用 Django 的 CreateView 中的表单字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41222008/

相关文章:

django - 在 nginx 上无需用户刷新即可提供更新文件的正确方法

python - 从 Django FileField 的响应中添加 zip 文件

python - 访问后如何将django表中的按钮更改为文本

django - 在 Django 中,如何在提交 CreateView 时重定向到 UpdateView?

django - 如何获取表单中的表单字段值并发送邮件

python - reportlab:如何设置初始/默认 View ?

css - 如何在 Django 1.4 中为本地开发提供静态文件

Django:从 View 中设置字段选择?

python - 使用 django 表单获取请求公开数据

python - URL 中的 Django Rest 所需参数