我的项目有问题。当我单击表单的提交按钮时,我可以在 request.POST (调试模式)中看到正确的数据,但函数“form.is_valid”返回错误。事实上,如果我跳过函数 e 仅写入 form.save ,它将引发“NOT NULL 约束失败:fatture_viaggio.distanza_km”。
这是我的代码:
def clienti(request):
clienti_list = Cliente.objects.all().order_by('nome').exclude(nome='Inalca')
viaggi_list = Viaggio.objects.all().order_by('-data_viaggio')
if request.method == 'POST':
if 'Aggiungi_Cliente' in request.POST:
formC = ClienteForm(request.POST)
if formC.is_valid():
nuovo_cliente = formC.save()
return redirect('clienti')
formV = ViaggioForm(request.POST)
#if formV.is_valid():
nuovo_viaggio = formV.save()
return redirect('clienti')
else:
formC = ClienteForm()
formV = ViaggioForm()
return render(request, 'fatture/clienti.html', {'formC': formC, 'formV': formV, 'clienti': clienti_list, 'viaggi': viaggi_list})
FormC 工作正常,只有 formV 有这个问题。
编辑
正如 Erny 的评论所建议的,这里是模板中的表单:
<div id="viaggio{{ cliente.id }}" style="display: none; width: 100%; background-color: #f1f1f1; padding: 10px; border: 1px solid #d4d4d4;">
<form id="viaggio-form" method="post">
{% csrf_token %}
<label>Data viaggio</label>
{{ formV.data_viaggio }}
<label>Ddt:</label>
{{ formV.ddt }}
<label>Prezzo viaggio:</label>
{{ formV.prezzo_viaggio }}
<label>Distanza km:</label>
{{ formV.distanza_km }}
<label>Mittente:</label>
{{ formV.mittente }}
<script>
$("#id_mittente").attr("id", "mittente{{ cliente.id }}");
$("#mittente{{ cliente.id }}").addClass("mittente{{ cliente.id }}")
</script>
<p></p>
<div style="display: none">
{{ formV.cliente }}
<script>
$("#id_cliente").attr("id", "cliente{{ cliente.id }}");
$('#cliente{{ cliente.id }} option').filter(function(i, e) { return $(e).text() == "{{cliente.nome}}"}).prop('selected', true)
</script>
</div>
<button type="submit" name="Aggiungi_Viaggio">Aggiungi Viaggio</button>
</form>
<button id="chiudi-form-{{ cliente.id }}">Chiudi</button>
</div>
以及形式:
class ViaggioForm(forms.ModelForm):
class Meta:
model = Viaggio
fields = ['data_viaggio','distanza_km','ddt','prezzo_viaggio','cliente','mittente']
def __init__(self, *args, **kwargs):
super().__init__()
numero = kwargs.pop('numero', None)
if numero == 1:
self.fields['cliente'].initial = Cliente.objects.get(nome='Inalca')
self.fields['cliente'].widget.attrs['readonly'] = True
self.fields['cliente'].required = False
else:
self.fields['cliente'].queryset = Cliente.objects.all().exclude(nome='Inalca')
编辑2
我已经改变了这样的形式,现在它可以工作了(我删除了构造函数):
class ViaggioForm(forms.ModelForm):
class Meta:
model = Viaggio
fields = ['data_viaggio','distanza_km','ddt','prezzo_viaggio','cliente','mittente']
为什么构造函数有问题?
构造函数中的 super 函数是错误的。我改成了正确的形式:
super(ViaggioForm, self).__init__(*args, **kwargs)