Изменение типа поля в формах django

У меня есть модель для группы, которая имеет два поля: лидер и описание.

models.py

class Group(models.Model):
   leader = models.ForeignKey(User, on_delete=models.CASCADE)
   description = models.TextField()

forms.py

class GroupForm(forms.ModelForm):

   class Meta:
      model = Group
      fields = ('leader', 'description')

Моя проблема заключается в том, что я хочу изменить тип поля для лидера. Сейчас по умолчанию это выпадающий список/выбор со всеми доступными пользователями в моей базе данных. Я не хочу, чтобы пользователи могли создавать группы по именам других пользователей. Вместо этого я хочу, чтобы поле лидера было полем TextInput и использовал javascript для изменения значения лидера на любое значение Users.username.

Итак, я добавил виджет, но теперь есть еще больше проблем:

forms.py

class GroupForm(forms.ModelForm):

   class Meta:
      model = Group
      fields = ('leader', 'description')

   widgets = {
      'leader': forms.TextInput(attrs={'id': 'leader', 'type': 'hidden', 'value': ''})
   }

Моя цель состояла в том, чтобы использовать тег скрипта в моем шаблоне django для getElementById('leader') и изменить его значение на user.username, сохраняя его скрытым от текущего пользователя.

Однако я продолжаю сталкиваться с трудностями, главная из которых заключается в том, что я не могу изменить тип поля для лидера с select на TextInput, поэтому каждый раз, когда я пытаюсь получить доступ к leader.value, я получаю undefined.

Любая помощь будет полезна. Спасибо.

widgets опция должна принадлежать форме Meta, а не телу класса формы (docs):

class GroupForm(forms.ModelForm):
    class Meta:
        model = Group
        fields = ('leader', 'description')

        widgets = {
            'leader': forms.TextInput(attrs={'id': 'leader', 'type': 'hidden'})
        }

Я не уверен, что клавиша value в виджете attrs будет работать, это по меньшей мере очень странно. Если вы делаете это для получения пустой строки, то это не обязательно: по умолчанию input.value является '', а не undefined.

Вернуться на верх