Ошибка при вставке данных в базу данных с помощью Ajax в Django после проверки ModelForm
Я создаю Django ModelForm
Частично работает, если я не валидирую форму, т.е. если я убираю оператор if form.is_valid(): из кода то значения вставляются в базу данных правильно
но если я использую его, то он показывает ошибку в консоли print("Errors ", form_to_insert_data.errors) как:
<ul class="errorlist"><li>name<ul class="errorlist"><li>write name</li></ul></li><li>ini_stg<ul class="errorlist"><li>This field is required.</li></ul></li><li>dev_stg<ul class="errorlist"><li>This field is required.</li></ul></li><li>mid_stg<ul class="errorlist"><li>This field is required.</li></ul></li><li>end_stg<ul class="errorlist"><li>This field is required.</li></ul></li><li>ini_kc<ul class="errorlist"><li>This field is required.</li></ul></li><li>dev_kc<ul class="errorlist"><li>This field is required.</li></ul></li><li>mid_kc<ul class="errorlist"><li>This field is required.</li></ul></li><li>end_kc<ul class="errorlist"><li>This field is required.</li></ul></li><li>root_len<ul class="errorlist"><li>This field is required.</li></ul></li></ul>
Однако, я правильно вставляю все значения в форму, т.е. отметки остаются пустыми.
и если я не передаю print("Errors ", form_to_insert_data.errors), то ошибка выглядит как
Internal Server Error: /url_for_crop_data_to_insert
Traceback (most recent call last):
File "C:\Python_Abhilash\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Python_Abhilash\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\handlers\base.py", line 188, in _get_response
self.check_response(response, callback)
File "C:\Python_Abhilash\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\handlers\base.py", line 309, in check_response
raise ValueError(
ValueError: The view waterbalance.views.save_inserted_cropdata didn't return an HttpResponse object. It returned None instead.
Код выглядит следующим образом
Модель
from django.db import models
from django.core.validators import MaxValueValidator, MinValueValidator
class CropDetail(models.Model):
name = models.CharField(max_length=100)
ini_stg = models.PositiveIntegerField(validators=[MinValueValidator(0.0), MaxValueValidator(100.0)])
dev_stg = models.PositiveIntegerField(validators=[MinValueValidator(0.0), MaxValueValidator(100.0)])
mid_stg = models.PositiveIntegerField(validators=[MinValueValidator(0.0), MaxValueValidator(100.0)])
end_stg = models.PositiveIntegerField(validators=[MinValueValidator(0.0), MaxValueValidator(100.0)])
ini_kc = models.FloatField(validators=[MinValueValidator(0.0), MaxValueValidator(2.0)])
dev_kc = models.FloatField(validators=[MinValueValidator(0.0), MaxValueValidator(2.0)])
mid_kc = models.FloatField(validators=[MinValueValidator(0.0), MaxValueValidator(2.0)])
end_kc = models.FloatField(validators=[MinValueValidator(0.0), MaxValueValidator(2.0)])
root_len = models.PositiveIntegerField(validators=[MinValueValidator(0.0), MaxValueValidator(2000)])
View
from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib.auth import logout, authenticate, login
from django.contrib import messages
from django.http import JsonResponse
from waterbalance.forms import add_crop_details_to_database
from waterbalance.models import CropDetail
def save_inserted_cropdata(request):
if request.method == "POST":
form = add_crop_details_to_database(request.POST)
print("form", form)
if form.is_valid():
CropName = request.POST["CropName"]
print("CropName", CropName)
InitialStage = request.POST["InitialStage"]
DevelopmentStage = request.POST["DevelopmentStage"]
MidStage = request.POST["MidStage"]
EndStage = request.POST["EndStage"]
InitialKc = request.POST["InitialKc"]
DevelopmentKc = request.POST["DevelopmentKc"]
MidStageKc = request.POST["MidStageKc"]
EndStageKc = request.POST["EndStageKc"]
RootLength = request.POST["RootLength"]
crop_data_to_pass = CropDetail(name=CropName, ini_stg=InitialStage, dev_stg=DevelopmentStage, mid_stg=MidStage, end_stg=EndStage,ini_kc=InitialKc, dev_kc=DevelopmentKc, mid_kc=MidStageKc, end_kc=EndStageKc, root_len=RootLength)
crop_data_to_pass.save()
return JsonResponse({'status': 'Save'})
else:
return JsonResponse({'status': "Failed"})
Форма
from django import forms
from waterbalance.models import CropDetail
class add_crop_details_to_database(forms.ModelForm):
class Meta:
model = CropDetail
fields = ["name", "ini_stg", "dev_stg", "mid_stg", "end_stg", "ini_kc", "dev_kc", "mid_kc", "end_kc", "root_len"]
labels = {"name":"Crop Name", "ini_stg":"Initial Stage Duration", "dev_stg":"Development Stage Duration", "mid_stg":"Mid-Season Stage Duration", "end_stg":"End-Season Stage Duration", "ini_kc":"Initial Stage Crop Coefficient", "dev_kc":"Development Stage Crop Coefficient", "mid_kc":"Mid-Season Stage Crop Coefficient", "end_kc":"End-Season Stage Crop Coefficient", "root_len":"Root Length (mm)"}
widgets = {
"name":forms.TextInput(attrs={"class":"form-control", "id":"name_id"}),
"ini_stg":forms.TextInput(attrs={"class":"form-control", "id":"ini_stg_id"}),
"dev_stg":forms.TextInput(attrs={"class":"form-control", "id":"dev_stg_id"}),
"mid_stg":forms.TextInput(attrs={"class":"form-control", "id":"mid_stg_id"}),
"end_stg":forms.TextInput(attrs={"class":"form-control", "id":"end_stg_id"}),
"ini_kc":forms.TextInput(attrs={"class":"form-control", "id":"ini_kc_id"}),
"dev_kc":forms.TextInput(attrs={"class":"form-control", "id":"dev_kc_id"}),
"mid_kc":forms.TextInput(attrs={"class":"form-control", "id":"mid_kc_id"}),
"end_kc":forms.TextInput(attrs={"class":"form-control", "id":"end_kc_id"}),
"root_len":forms.TextInput(attrs={"class":"form-control", "id":"root_len_id"})
}
URLs
from django.contrib import admin
from django.urls import path
from waterbalance import views
urlpatterns = [
path('', views.index, name="index"),
path('login', views.loginUser, name="login"),
path('logout', views.logoutUser, name="logout"),
path('cropdatabase', views.cropdatabase, name='cropdatabase'),
path('url_for_crop_data_to_insert', views.save_inserted_cropdata, name='url_for_crop_data_to_insert'),
]
HTML
Как вставить значения в базу данных после валидации?