【发布时间】: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