IntegrityError at /update_dept/1/ NOT NULL constraint failed: main_department.dept_name
Я создаю простую django модель доктора и отделения. между ними нет связи, и когда я пытаюсь обновить отделение, она показывает мне эту ошибку IntegrityError at /update_dept/1/ NOT NULL constraint failed: main_department.dept_name
Эта ошибка новая для меня. Я проверил другие подобные вопросы, но ничего не понял. Так что прошу помочь мне.
вот мой файл view.py
from django.shortcuts import render
from .forms import Doctorslist,Departmentform
from .models import Department, Doctor
from django.shortcuts import redirect
from django.views.generic import (CreateView, DetailView, UpdateView, ListView, TemplateView, DeleteView)
from django.contrib.messages import constants as messages
import os
# Create your views here.
def add_show(request):
form = Doctorslist()
if request.method == "POST":
form = Doctorslist(request.POST, request.FILES)
form.save()
return redirect('/')
else:
form = Doctorslist()
stud = Doctor.objects.all
context = {'form':form,
'stu':stud
}
return render(request, 'main/index.html', context)
def update_data(request, id):
prod = Doctor.objects.get(id=id)
if request.method == "POST":
prod.doc_image = request.FILES['doc_image']
prod.kycdocument = request.FILES['kycdocument']
prod.name = request.POST.get('name')
prod.phone_number = request.POST.get('phone_number')
prod.email = request.POST.get('email')
prod.city = request.POST.get('city')
prod.speciality = request.POST.get('email')
prod.save()
messages.success(request, "Product Updated Successfully")
return redirect('/')
context = {'prod':prod}
return render(request, 'main/update_doc.html', context)
def delete_data(request,id):
if request.method =='POST':
pi = Doctor.objects.get(pk = id)
pi.delete()
return redirect('/')
def add_show_dept(request):
form = Departmentform()
if request.method == "POST":
form = Departmentform(request.POST)
form.save()
return redirect('/')
else:
form = Departmentform()
dept = Department.objects.all
context = {'form':form,
'stu':dept
}
return render(request, 'main/pages-profile.html', context)
def update_dept_data(request, id):
prod = Department.objects.get(id=id)
if request.method == "POST":
prod.dept_name = request.POST.get('dept_name')
prod.dept_Email = request.POST.get('dept_Email')
prod.save()
messages.success(request, "Product Updated Successfully")
return redirect('/')
context = {'prod':prod}
return render(request, 'main/update_dept.html', context)
здесь model.py
from django.db import models
from phonenumber_field.modelfields import PhoneNumberField
import os
# Create your models here.
import datetime
def get_file_path(request, filename):
filename_original = filename
nowTime = datetime.datetime.now().strftime('%Y%m%d%H:%M:%S')
filename = "%s%s" % (nowTime, filename_original)
return os.path.join('uploads/', filename)
class Doctor(models.Model):
name = models.CharField(max_length=20)
phone_number = PhoneNumberField(null=False, blank=False, unique=True)
email = models.EmailField(max_length = 100)
city = models.CharField(max_length=100)
speciality = models.CharField(max_length=50)
doc_image = models.ImageField(upload_to = get_file_path)
kycdocument = models.ImageField(upload_to = get_file_path, null = True, blank = True)
class Department(models.Model):
dept_name = models.CharField(max_length=20)
dept_Email = models.EmailField(max_length=100)
dept_password = models.CharField(max_length=200)
здесь находится файл forms.py
from django import forms
from phonenumber_field.modelfields import PhoneNumberField
from .models import Doctor,Department
class Doctorslist(forms.ModelForm):
class Meta:
model = Doctor
fields = ('name','phone_number','email', 'city', 'speciality', 'doc_image', 'kycdocument')
# widgets = {
# 'name': forms.TextInput(attrs = {'class': 'form-control'}),
# 'email': forms.EmailInput(attrs={'class': 'form-control'}),
# 'city': forms.CharField(attrs={'class': 'form-control'}),
# 'speciality': forms.CharField(attrs={'class': 'form-control'}),
# }
class Departmentform(forms.ModelForm):
class Meta:
model = Department
fields = ('dept_name','dept_Email','dept_password')
widgets = {'dept_password': forms.PasswordInput()}
Ваша HTML-форма использует неправильные имена, и поэтому request.POST
не содержит записей типа dept_name
и dept_Email
. Вам следует указать name="dept_name"
вместо и name="name"
name="dept_Email"
вместо :name="price"
<div class="mb-3">
<label for="" class="form-label">Name</label>
<input type="text" Required name="dept_name" value="{{ prod.dept_name }}" class="form-control">
</div>
<div class="mb-3">
<label for="" class="form-label">Email</label>
<input type="text" Required name="dept_Email" value="{{ prod.dept_Email }}" class="form-control">
</div>
При этом я бы настоятельно рекомендовал использовать ModelForm
, вы можете сделать второй ModelForm
для отдела, где вы опустите dept_password
.
Вы можете посмотреть раздел Рендеринг полей вручную в документации, где показано, как вы можете отобразить вашу Django форму с помощью пользовательского HTML.