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})

Думаю, это решит вашу проблему

Вернуться на верх