Этот вопрос также может быть сформулирован как: «Как изменить атрибуты созданной формы CreateView?»Отключить поле формы в Django's 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,
)
Технически это будет состоять на заполнение формы с текущим «учителя» вошли и отключить поле, если текущий пользователь не является привилегированным. В настоящее время я выполняю настройку начального значения с помощью следующего кода, но я не знаю, как запретить обычным пользователям изменять поле «учитель».
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, если это возможно.
Другой вариант - ограничить параметры в раскрывающемся списке в форме, но я не знаю, как это сделать.
Любые советы, включая другую точку зрения, приветствуются.
Выглядит хорошо, но было бы полезно только для формы редактирования, а не создавать форма. В режиме создания обычный пользователь фактически определит поле «учитель», но только как сам. В идеале его можно решить, просто установив атрибут «disabled» в поле «учитель» во время создания формы, но я не знаю, какой метод переопределить для этого. – jjchico
Вы делаете это с кодом 'form_valid', который вы показали выше, снова внутри блока if, который проверяет разрешение. –