python - /updatestudent/3 处的 Django ValueError 无法分配“'1'”:“Student.class_id”必须是“Class”实例
问题描述
/updatestudent/3 处的 ValueError 无法分配“'1'”:“Student.class_id”必须是“Class”实例。当我尝试更新我的学生模型时会出现此错误。当我更新用户名时,它不会引发任何错误,但如果我不更新用户名,则只会引发此错误
任何帮助都是有帮助的。
模型.py
class CustomUser(AbstractUser):
user_type_data = ((1,'HOD'),(2,'Staff'),(3,'Student'))
user_type = models.CharField(default=1, choices=user_type_data, max_length=10)
class Student(models.Model):
id = models.AutoField(primary_key=True)
admin = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
gender = models.CharField(default=1, choices=gender_type, max_length=10)
profile = models.ImageField(upload_to='student/profile-images/%y/%m/%d/', default='student/profile-images/default.jpg', blank=False, null=False)
address = models.TextField()
class_id = models.ForeignKey(Class, on_delete=models.CASCADE, default=1)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
objects = models.Manager()
def full_name(self):
return self.admin.first_name+' '+self.admin.last_name
def __str__(self):
return self.admin.username
class Session(models.Model):
id = models.AutoField(primary_key=True)
session_start= models.IntegerField()
session_end = models.IntegerField()
objects = models.Manager()
def __str__(self):
return f'{self.session_start} {self.session_end}'
class Course(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=255)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
objects = models.Manager()
def __str__(self):
return self.name
class Class(models.Model):
id = models.AutoField(primary_key=True)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
branch = models.CharField(default='CSE', choices=branch_data, max_length=40)
year = models.CharField(default='First Year', choices=year_data, max_length=15)
session = models.ForeignKey(Session, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)
objects = models.Manager()
def __str__(self):
return f'{self.course} {self.branch} {self.year} {self.session}'
def name(self):
return f'{self.course} {self.branch} {self.year} {self.session}'
表格.py
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserChangeForm, UserCreationForm
from django.db.models import fields
from .models import (AdminHOD, Staff, Student, Class,
CustomUser, Course, Session, Attendance,
ExamType, Exam, Subject)
from .models import branch_data, year_data
gchoice = (('1','Male'),('2','Female'))
sesschoice = tuple((i.id, i.id) for i in Session.objects.all())
courchoice = tuple((i.id,i) for i in Course.objects.all())
choice_exam = tuple((i.id,i.name) for i in ExamType.objects.all())
all_class = tuple((i.id, i.name) for i in Class.objects.all())
class UserUpdateForm(UserChangeForm):
email = forms.EmailField()
class Meta:
model = User
fields = ['first_name', 'last_name', 'username', 'email']
class StudentUpdateForm(forms.ModelForm):
gender = forms.ChoiceField(choices=gchoice)
address = forms.CharField()
class_id = forms.ChoiceField(choices=all_class)
class Meta:
model = Student
fields = ['gender', 'class_id', 'address']
视图.py
if request.method=='POST':
uform = UserUpdateForm(request.POST)
sform = StudentUpdateForm(request.POST)
if uform.is_valid():
address = request.POST.get('address')
username = request.POST.get('username')
clas = Class.objects.get(id=request.POST['class_id'])
email = request.POST.get('email')
gender = request.POST.get('gender')
print(clas)
try:
student = Student.objects.get(id=id)
user = student.admin
user.username = username
user.email = email
user.save()
student.address = address
student.gender = str(gender)
student.class_id = clas
student.updated_at = datetime.datetime.now()
student.save()
messages.success(request,'Student successfully Updated.')
return redirect('/managestudent')
except:
messages.error(request,'Student has not been Updated due to some technical issues.')
return render(request, 'cmsapp/hod/studentupdate.html', {'uform':uform,'sform':sform})
else:
messages.error(request,sform.errors)
return render(request, 'cmsapp/hod/studentupdate.html', {'uform':uform,'sform':sform})
else:
uform = UserUpdateForm(instance=Student.objects.get(id=id).admin)
sform = StudentUpdateForm(instance=Student.objects.get(id=Student.objects.get(id=id).id))
return render(request, 'cmsapp/hod/studentupdate.html', {'uform':uform,'sform':sform})
学生更新.html
<h3>Update Student</h3>
<form action="" method="POST" class="form-group">
{% csrf_token %}
{{uform}}
{{sform}}
<button type="submit">Update Student</button>
</form>
</div>
追溯
Traceback (most recent call last):
File "C:\Users\Akash Deep Saingar\Desktop\MySite\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\Akash Deep Saingar\Desktop\MySite\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Akash Deep Saingar\Desktop\MySite\CollegeErp\cmsapp\hodviews.py", line 176, in update_student
messages.error(request,sform.errors)
File "C:\Users\Akash Deep Saingar\Desktop\MySite\venv\lib\site-packages\django\forms\forms.py", line 172, in errors
self.full_clean()
File "C:\Users\Akash Deep Saingar\Desktop\MySite\venv\lib\site-packages\django\forms\forms.py", line 376, in full_clean
self._post_clean()
File "C:\Users\Akash Deep Saingar\Desktop\MySite\venv\lib\site-packages\django\forms\models.py", line 400, in _post_clean
self.instance = construct_instance(self, self.instance, opts.fields, opts.exclude)
File "C:\Users\Akash Deep Saingar\Desktop\MySite\venv\lib\site-packages\django\forms\models.py", line 63, in construct_instance
f.save_form_data(instance, cleaned_data[f.name])
File "C:\Users\Akash Deep Saingar\Desktop\MySite\venv\lib\site-packages\django\db\models\fields\__init__.py", line 891, in save_form_data
setattr(instance, self.name, data)
File "C:\Users\Akash Deep Saingar\Desktop\MySite\venv\lib\site-packages\django\db\models\fields\related_descriptors.py", line 215, in __set__
raise ValueError(
Exception Type: ValueError at /updatestudent/3
Exception Value: Cannot assign "'1'": "Student.class_id" must be a "Class" instance.
解决方案
在StudentUpdateForm
中,尝试将class_id
字段更改为:
class_id = forms.ModelChoiceField(queryset=Class.objects.all())
推荐阅读
- shell - 鱼壳 argparse 做了一些非常意外的事情
- unity3d - Unity3D WebGL Headless 不渲染
- python - 同时用两个中间(两个指针)进行二分查找
- database - 如何对 Anylogic 中的表进行动态引用?
- mongodb - 如何在 mongo db 中使用大型 $in 数据集执行查询
- laravel - 如何使用一个视图和多个守卫 Laravel
- vhdl - 为什么这个函数编译不流畅但是Modelsim拒绝模拟呢?
- sql - 从 PARTITION BY 中选择行的更有效方法
- javascript - 检查在 for 循环期间是否填充了 Element 值
- shell - 如何使用 sed 命令插入变量内容