Невозможно отправить данные в базу данных в Django

Я абсолютный новичок в разработке Django; я не могу отправить данные в мою базу данных через метод POST. Пожалуйста, подскажите мне, что не так в моем подходе. Моя модель работала отлично, и теперь я могу получить доступ к нужной мне таблице в админке Django. Функция, которую я создал в views.py, всегда выполняет условие else.

Из файла views.py:

from django.shortcuts import render, HttpResponse, redirect
from app.models import Tbl_Feedback

def myform(request):
    return render(request, 'form.html')
def getfeedback(request):
    if request == "POST":
        a = request.POST.get('a')
        objTbl_Feedback = Tbl_Feedback(a="a")
        objTbl_Feedback.save()
        return redirect("/")
    else:
        return HttpResponse('Form Not Submitted')

Из models.py:

from django.db import models

# Create your models here.

class Tbl_Feedback(models.Model):
    fdbk = models.CharField(max_length=120)
    

From urls.py(app):

from django.contrib import admin
from django.urls import path
from app import views

urlpatterns = [
    
    path('',views.myform,name="form"),
    path('getfeedback', views.getfeedback, name="feedback")
]

From urls.py(project):

 from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path("", include("app.urls"))
    ]

    

Html:

<!DOCTYPE html>
<html lang="en">
    {% load static %}
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Form</title>
    {% load static %}
    <link rel="stylesheet" href="{%static 'css.css'%}">

</head>
<body>
    <form action="getfeedback" method="post" >
        {% csrf_token %}
        <div class="frame">
            <div class="frame-header">FeedBack Please !</div>
            <div class="frame-body">
                <div class="form-element">
                    <div class="element-label"><label for="a">FeedBack</label></div>
                    <div class="element-controller">
                        
                        <textarea name="a" id="a" cols="30" rows="5" class="controller-input"
                        autofocus="autofocus" maxlength="120"></textarea>
                    </div>
                </div>
                
            </div>
            <div class="frame-footer"><button type="submit">Submit</button> </div>
        </div>

    </form>

    
</body>

</html>

Шаблоны Django не понимают имен представлений, при отправке формы значения будут возвращены в то же представление, из которого был отправлен запрос.

В вашем файле views.py

from django.shortcuts import render, HttpResponse, redirect
from app.models import Tbl_Feedback

def myform(request):
    if request.method == "GET":
        return render(request, 'form.html')

    if request == "POST":
        a = request.POST.get('a')
        objTbl_Feedback = Tbl_Feedback(a="a")
        objTbl_Feedback.save()
        return redirect("/") 

и ваше приложение urls.py должно выглядеть следующим образом

from django.contrib import admin
from django.urls import path
from app import views

urlpatterns = [
    
    path('',views.myform,name="form"),
]

и в вашем шаблоне удалите действие формы

 <form method="post">

Чтобы узнать, как использовать и отправлять форму в Django : здесь.

В вашем случае (и вообще), вот как вы можете сделать простой POST запрос на Django.

  1. views.py ( Это обычное решение для обработки обоих POST и GET запросов одним и тем же представлением. Я сделаю это следующим образом )

     def feedback_form(request):
         # Handle POST requests
         if request.method == 'POST':
             # It's request.method == 'POST', not request == 'POST'
             a = request.POST.get('a')
             objTbl_Feedback = Tbl_Feedback(a="a")
             objTbl_Feedback.save()
             # Take the habit to use url's name instead of hard coded url
             return redirect("form")
         else:
             # Handle non POST requests
             return render(request, 'form.html')
    
  2. urls.py

     urlpatterns = [
    
         path('',views.feedback_form,name="form"),  # This view handle POST and GET request
         # path('getfeedback', views.getfeedback, name="feedback")
     ]
    
  3. urls.py (проект) Не менять

  4. form.html

    .

Здесь необходимо настроить атрибут action формы

     <!-- Again use Django url tag instead of hard coded url -->
     <form action="{% url 'form' %}" method="post" >
     ...
     </form>

В вашем представлении getfeedback есть две проблемы.

  1. Вам нужно написать if request.method == 'POST':
  2. "a" не является полем в вашей модели
def getfeedback(request):
    if request.method == "POST":
        a = request.POST.get('a')
        objTbl_Feedback = Tbl_Feedback(fdbk="a")
        objTbl_Feedback.save()
        return redirect("/")
    else:
        return HttpResponse('Form Not Submitted')
Вернуться на верх