将 field.required 设置为 false 会导致错误列表索引必须是整数或切片,而不是 str

问题描述 投票:0回答:1

我想设置一个页面来更新用户信息,包括一个用于创建新密码的字段。此页面仅供更新现有用户。此页面中的密码字段是可选的。

还有另一个页面,具有另一个视图来创建用户,其中需要密码字段。

我目前的做法是在视图中设置需要为 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)

但是我不知道如何在创建用户时强制输入密码字段而不引发相同的错误。

python django
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.