【问题标题】:Why Django return form is invalid?为什么 Django 返回表单无效?
【发布时间】:2017-07-22 14:41:14
【问题描述】:

我有一个函数问题,当我使用标签 {{form.image_cliente}} 时,总是返回一个“表单无效”并且不保存任何内容,但如果我使用标签 {{form.as_p}}返回一个表单有效并保存字段image_cliente,不知道为什么,我只想在模板中显示form.image_cliente。

我的客户表格:

class ClienteForm(forms.ModelForm):

id_tipo_cliente = forms.ModelChoiceField(queryset=Tipo_cliente.objects.filter(status=1), label="Tipo de cliente" ,empty_label="Seleciona tipo", widget=forms.Select(attrs={'value':'form-control'}))

password = forms.CharField(label="Password", required=False,
                        widget=forms.PasswordInput)

class Meta:

    model = Cliente
    exclude = ['status', 'id_usuario_alt', 'fecha_creacion', 'fecha_modificacion', 'fecha_cancelacion']
    fields = [

    'nombres',
    'apellidos',
    'usuario',
    'password',
    'correo_electronico',
    'direccion',
    'telefono',
    'telefono_celular',
    'id_tipo_cliente',
    'image_cliente',
    ]

    labels = {'nombres':'Nombres', 'apellidos':'Apellidos', 'usuario':'Usuario', 'correo_electronico':'Correo', 'direccion':'Direccion', 'telefono':'Telefono', 'telefono_celular':'Celular', }
    widgets = {

    'nombres': forms.TextInput(attrs={'class':'form-control'}),
    'apellidos': forms.TextInput(attrs={'class':'form-control'}),
    'usuario': forms.TextInput(attrs={'class':'form-control'}),
    'correo_electronico': forms.TextInput(attrs={'class':'form-control'}),
    'direccion': forms.TextInput(attrs={'class':'form-control'}),
    'telefono': forms.TextInput(attrs={'class':'form-control'}),
    'telefono_celular': forms.TextInput(attrs={'class':'form-control'}),
    'image_cliente':forms.ClearableFileInput(attrs={'multiple': True, 'class':'file', 'data-show-upload':'false', 'data-show-preview':'false'})

    }

在我看来这是我的 def 函数:

def subirIMGCliente(request, pk):

clientes = get_object_or_404(Cliente, pk=pk)


if request.method == 'POST':
    form = ClienteForm(request.POST, request.FILES, instance=clientes)

    if form.is_valid():
        clientes = form.save(commit=False)
        if clientes.password == '':
            clientes.save(update_fields=['image_cliente'])
            print('yes');

        return redirect('BackEnd:cliente')
    else:
        print('form in not valid');

else:

    form = ClienteForm(instance=clientes)

return render(request, 'back/Modulo_cliente/imagenes_cliente.html', {'form': form })

我的模板

    <form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <div class="form-group">  

               {{form.image_cliente}}
            </div>
        </div>
       </div>
        </br>

        <br>    <div class="row">
         <div class="col-md-8 col-md-offset-2">
     <button class="btn btn-success" type="submit">Guardar</button>

      <a href = "{% url 'BackEnd:cliente' %}" class = "btn btn-primary ">        <span>Regresar</span></a>


    </div>
    </div>
   </div>
   </form>

【问题讨论】:

  • 请提供 ClienteForm 的定义。还尝试检查两种情况的 html 输出。它应该可以帮助您了解问题所在。
  • 我编辑了帖子
  • form.errors之后打印print('form in not valid')时显示什么错误?
  • 打印这个:8 个字段中的必填字段,但我不明白为什么,因为我实例化了该对象,如果我使用标签 {{form.as_p}} 它​​可以工作,我不明白为什么

标签: django django-forms django-templates django-views


【解决方案1】:

以下字段为必填项:

  • usuario
  • 名词
  • 方向
  • 阿贝里多斯
  • id_tipo_cliente
  • correo_electronico
  • 电话
  • telefono_cellular

像在密码字段中一样在它们上添加 required=False,然后您就可以上路了。

您为该对象添加一个实例,并且该对象具有所有必填表单字段的值,因此当您加载 form.as_p 或任何其他输出整个表单的标签时,它会加载填写所有必填字段.这样,提交表单时,不会出现验证错误。有效性检查是通过 request.POST 而不是在原始模型实例上完成的,因此当提交的表单没有某些必填字段时,您会收到验证错误。

要调试这类问题,请在模板的某处添加 {{form.errors}}。这就是我在您的表单中发现错误的方式。

最佳做法是在表单顶部的列表中显示所有与字段无关的错误,并在每个表单字段旁边显示与字段相关的错误。 所以你会在模板的顶部添加这样的东西:

<ol>
  {% for error in form.non_field_errors %}
    <li><strong>{{ error|escape }}</strong></li>
  {% endfor %}
</ol>

对于 image_cliente 表单字段,类似这样:

{% if form.image_cliente.errors %}
  <ol>
    {% for error in form.image_cliente.errors %}
      <li><strong>{{ error|escape }}</strong></li>
    {% endfor %}
  </ol>
{% endif %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多