我是 django 的新手,我的表单有一些问题。它没有提交任何东西。我不知道为什么,终端中没有出现任何问题。它正确显示了表单,但是在填写并提交时,它只是将我重定向到相同的表单但空白。我检查了数据库,但没有添加任何内容。我的代码如下:
#views.py
def ContractView(request):
form=contractsform(request.POST)
if form.is_valid():
con =form.save()
return redirect("{% url 'contracts' %}", con.id)
else:
form = contractsform()
return render(request, 'contform.html', {'form': form})
#contform.html
<div class="card-body">
<form action="" method="POST" class="row g-3">
{% csrf_token %}
<label for="{{ form.subject.id_for_label }}">Name:</label>
{{form.name}}
<div class="col-md-6">
<label for="{{ form.subject.id_for_label }}">Contractor:</label>
<div class="input-group input-group-sm mb-3">
{{form.contractor}}
<button id="new-vendor" class="btn btn-outline-secondary" type="button">+</button>
</div>
</div>
<div class="col-md-6">
<label for="{{ form.subject.id_for_label }}">Contractee:</label>
{{form.contractee}}
</div>
...
<div class="col-md-6">
<button type="button" onclick="javascript:history.back()">Cancel</button>
</div>
<div class="col-md-6">
<input type="submit" value="Submit" class="btn btn-primary" style="float: right;">
</div>
</form>
#forms.py
class contractsform(forms.ModelForm):
class Meta:
model = Contratos
fields = '__all__'
widgets = {
'name': forms.TextInput(attrs ={'class': 'form-control'}),
'contractee': forms.TextInput(attrs={'class': 'form-control'}),
'contractor': forms.Select(attrs={'class': 'form-control', 'id': 'contractor_view' }),}
#urls.py
urlpatterns = [
path('contracts/', views.contratostabla, name='contracts'),
path('contracts/add/', ContractView, name='new-contract'),
]
最佳答案
您当前正在将表单重新定义为无效的空表单,您需要更改逻辑以在请求方法为 POST 时使用填充 POST 数据的表单,而在请求方法为 GET 时使用空表单。当它无效时,您仍然需要使用已填写的表单进行 POST,以便您获得错误和以前的数据
def ContractView(request):
if request.method == 'POST':
form = contractsform(request.POST)
if form.is_valid():
con = form.save()
return redirect("{% url 'contracts' %}", con.id)
else:
form = contractsform()
return render(request, 'contform.html', {'form': form})
仅供引用,关于可读性,惯例是对类使用 CamelCase,这样您的表单将被命名为 ContractsForm
,对函数使用带下划线的小写字母,因此您的 View 将是 contract_view
关于python - Django 表单,未提交表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72835117/