2017-03-02 122 views
0

當我使用標記{{form.image_cliente}}總是返回一個「表單無效」並且不保存任何內容,但如果我使用標記{{form.as_p}}返回一個表單是有效的,並保存字段image_cliente,我不知道爲什麼,我只想在模板中只顯示form.image_cliente。爲什麼Django返回表單無效?

MYS形式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 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> 
+0

PLS還提供ClienteForm的定義。另外嘗試檢查這兩種情況下的html輸出。它應該可以幫助你瞭解問題的癥結所在。 – snakey

+0

我編輯了文章 –

+0

打印'form.errors'後顯示什麼錯誤'print('form in not valid')'後面? – alfredo138923

回答

1

需要以下字段:

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

添加所需=假對他們像你的密碼字段,你會繼續你的方式。

您爲對象添加一個實例,並且該對象具有所有必填表單字段的值,因此當您加載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 %} 
相關問題