Django Form, форма не отправляется
Я довольно новичок в 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
, и lowercase-with-underscores для функций, так что ваше представление будет contract_view
Вы можете обновить представление следующим образом
def ContractView(request):
form = contractsform(request.POST or None)
if form.is_valid():
con = form.save()
con.save()
return redirect("{% url 'contracts' %}", con.id)
else:
form = contractsform()
return render(request, 'contform.html', {'form': form})
Думаю, это решит вашу проблему