Django не может отправить форму с помощью ModelForm

#django #django-forms

#django #django-forms

Вопрос:

Форма всегда отправляет запрос Get вместо Post, который был явно добавлен с помощью method = «POST». Таким образом, невозможно сохранить данные в БД. Я только начал с Django, поэтому любая помощь будет оценена. Ниже приведены фрагменты кода:

create_order.html

 <form method="POST" action="{% url 'home' %}">
    {% csrf_token %}
    {{form}}
    <input class="btn btn-primary btn-sm" type="submit" name="Submit">
</form>

  

urls.py

 urlpatterns = [
    path('', views.dashboard, name='home'),
    path('products/', views.product, name='products'),
    path('customer/<str:cust_id>/', views.customer, name='customer'),
    path('create_order/', views.create_order, name='create_order'),
]
  

views.py

 def create_order(request):
    
    form = OrderForm()
    if request.method == 'POST':
        print("In Post", request.method)
        form = OrderForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/')
    else:
        print("In else", request.method)
        print(form.is_valid())
        if form.is_valid():
            form.save()
            return redirect('/')    
    context = {'form' : form}
    return render(request, 'accounts/create_order.html', context)   
  

вывод терминала

In else GET False

Ответ №1:

Вы отправляете запрос POST в неправильный вид. Это должно быть create_order представление, поэтому:

 <form method="POST" action="{% url 'create_order' %}">
    {% csrf_token %}
    {{ form }}
    <input class="btn btn-primary btn-sm" type="submit" name="Submit">
</form>  

Обратите внимание, что вы не должны проверять форму в случае запроса GET, поскольку тогда вы только отображаете форму. Таким образом, логика представления должна быть:

 def create_order(request):
    if request.method == 'POST':
        print("In Post", request.method)
        form = OrderForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('home')
    else:
        form = OrderForm()
    context = {'form' : form}
    return render(request, 'accounts/create_order.html', context)  

Комментарии:

1. Спасибо @Willem, это сработало. Кроме того, я мог бы сделать это, даже не добавляя действие. <form method="POST" action=""> {% csrf_token %} {{form}} <input class="btn btn-primary btn-sm" type="submit" name="Submit"> </form>

Ответ №2:

Попробуйте добавить метод действия формы в свой HTML-файл

  <form action="" method="post">{% csrf_token %}
            {{ form}}
            <input type="submit" value="Submit Feedback" />
        </form>
    </div>