2

Этот вопрос также может быть сформулирован как: «Как изменить атрибуты созданной формы 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, если это возможно.

Другой вариант - ограничить параметры в раскрывающемся списке в форме, но я не знаю, как это сделать.

Любые советы, включая другую точку зрения, приветствуются.

ответ

2

Рассматривая код, виды редактирования генерируют форму в пределах get_form_class на основе значения атрибута fields. Это определяется как атрибут класса, но код действительно ссылается на него через 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) 

(Казалось бы, бессмысленно еще блок, чтобы гарантировать, что мы всегда установить переменную экземпляра.)

+0

Выглядит хорошо, но было бы полезно только для формы редактирования, а не создавать форма. В режиме создания обычный пользователь фактически определит поле «учитель», но только как сам. В идеале его можно решить, просто установив атрибут «disabled» в поле «учитель» во время создания формы, но я не знаю, какой метод переопределить для этого. – jjchico

+0

Вы делаете это с кодом 'form_valid', который вы показали выше, снова внутри блока if, который проверяет разрешение. –