Невозможно отправить данные в базу данных в 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.
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')
urls.py
urlpatterns = [ path('',views.feedback_form,name="form"), # This view handle POST and GET request # path('getfeedback', views.getfeedback, name="feedback") ]
urls.py (проект) Не менять
form.html
.
Здесь необходимо настроить атрибут action
формы
<!-- Again use Django url tag instead of hard coded url -->
<form action="{% url 'form' %}" method="post" >
...
</form>
В вашем представлении getfeedback есть две проблемы.
- Вам нужно написать
if request.method == 'POST':
- "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')