Установка значения 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']
Вы хотите установить поле пароля необязательным.
Вы можете сделать это двумя способами:
- Создайте свою собственную форму, сделав поле пароля необязательным, и прикрепите ее к представлению.
- Получите форму, созданную классом 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