Установка значения field.required в false приводит к ошибке Индексы списка должны быть целыми числами или фрагментами, а не строками

Я хочу создать страницу для обновления информации о пользователе, включая поле для создания нового пароля. Эта страница предназначена только для обновления информации о существующем пользователе. Поле для ввода пароля на этой странице будет необязательным.

Есть другая страница с другим представлением для создания пользователя, где поле пароля является обязательным.

Мой текущий подход заключается в установке поля required в false в представлении, как показано ниже

class User(AbstractUser):
    password = models.CharField(max_length=200)
    # ommited the rest for brevity
class UserEdit(UpdateView):
    model = User 
    fields = ['fullname', 'username','status','email','phone_number','role','program_studi','password']
    template_name = 'user-management-edit.html'
    success_url = reverse_lazy('user-management')
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.initial['password'] = ''
        self.fields['password'].required = False
    
    def form_valid(self, form):
        form.instance.edited_by = self.request.user
        password = form.cleaned_data.get('password', None)
        if password:
            form.instance.set_password(password)
        return super().form_valid(form)
{% for field in form %}
    {% if field.name in inline_field %}
        <div class="col-4">
            {% if field.field.required %}
                {% bootstrap_field field label_class='control-label required' %}
            {% else %}
                {% bootstrap_field field %}
            {% endif %}
        </div>
    {% else %}
        <div class="col-12 {% if field.name == 'radio_input' %} col-radio-input {% endif %}">
            {% if field.field.required %}
                {% bootstrap_field field label_class='control-label required' %}
            {% else %}
                {% bootstrap_field field %}
            {% endif %}
       </div>
    {% endif %}
{% endfor %}

Однако строка self.fields['password'] продолжала бросать TypeError list indices must be integers or slices, not str, и я понятия не имею, почему.

Я попытался удалить требуемое из самой модели, как показано ниже

class User(AbstractUser):
    password = models.CharField(max_length=200, blank=True, null=True)

но тогда я не представляю, как сделать поле пароля обязательным при создании пользователя без возникновения той же ошибки.

self.fields['password'].required = False неправильно

Поскольку fields - это просто список, не словарь и не объект класса, вы не можете получить к нему доступ, используя синтаксис ['password']. Кроме того, поскольку список содержит строки, а не объекты со свойством required, вы также не можете использовать .required.

Фактически вы сами определяете список fields:

class UserEdit(UpdateView):
    model = User 
    fields = ['fullname', 'username','status','email','phone_number','role','program_studi','password']

Вы хотите установить поле пароля необязательным.

Вы можете сделать это двумя способами:

  1. Создайте свою собственную форму, сделав поле пароля необязательным, и прикрепите ее к представлению.
  2. Получите форму, созданную классом UpdateView, и измените ее required поле (то, что вы пытаетесь сделать)
class UserEdit(UpdateView):
    model = User 
    fields = ['fullname', 'username','status','email','phone_number','role','program_studi','password']
    template_name = 'user-management-edit.html'
    success_url = reverse_lazy('user-management')
    
    # rest of your code
    # ...

    @override
    def get_form(self, form_class=None):
        form = super().get_form(form_class)
        form.fields['password'].required = False
        return form
Вернуться на верх