我想设置一个页面来更新用户信息,包括一个用于创建新密码的字段。此页面仅供更新现有用户。此页面中的密码字段是可选的。
还有另一个页面,具有另一个视图来创建用户,其中需要密码字段。
我目前的做法是在视图中设置需要为 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']
您可以通过两种方式完成:
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