为什么Django返回表单无效?

时间:2017-03-02 18:06:27

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

我遇到问题,当我使用标签{{form.image_cliente}}时,总是返回一个"表格无效"什么都不保存,但如果我使用标签{{form.as_p}}返回一个表格是有效的并保存字段image_cliente,我不知道为什么,我只是想显示form.image_cliente在模板。

Mys form 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>

1 个答案:

答案 0 :(得分:1)

需要以下字段:

  • usuario
  • nombres
  • direccion
  • apellidos
  • id_tipo_cliente
  • correo_electronico
  • telefono
  • telefono_celular

在密码字段上添加一个必需= 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 %}