python - 选择一个有效的选择 Django Filtered Drop Down Menu
问题描述
开发人员,
在我的项目中,我有一个表单,其中包含一个选择学生姓名的字段,它是当前就读于该特定班级的学生的下拉字段。它从表 Section Enrollment 中获取此信息,而不是检查 master Student 表。过滤工作正常,但是当我提交表单时,它说学生姓名不是一个有效的选择。我的猜测是因为它提交的是学生姓名而不是 ID,我不能 100% 确定。这是我的模型和视图。我不知道如何解决这个问题。感谢您的帮助。
QUERY IN QUESTION:
getstudents = SectionEnrollment.objects.filter(section_id=classid).select_related().values_list('studentpsid_id__student_name', flat = True)
MODELS:
# Creation of Classrooms and Assigned Teachers
class SectionEnrollment(models.Model):
sectionenrollmentpsid = models.CharField(primary_key = True,max_length = 50, default = "")
section = models.ForeignKey(Section,on_delete = models.PROTECT, default = "" ,)
studentpsid = models.ForeignKey(Student,on_delete = models.PROTECT, default = "" ,)
entry_date = models.DateField(blank=True)
exit_date = models.DateField(blank=True)
dropped = models.BooleanField(default = False, blank = True)
class Meta:
verbose_name = "Student Section Enrollment"
def __str__(self):
return self.sectionenrollmentpsid
# Where Basic Student Data Is Stored
class Student(models.Model):
studentpsid= models.CharField(primary_key = True , default = "", max_length = 50, unique = True)
student_name = models.CharField(max_length = 50)
first_name = models.CharField(max_length = 50, default = "")
last_name = models.CharField(max_length = 50,default = "")
gender = models.CharField(max_length = 1,default = "")
student_grade = models.CharField(max_length = 2, default = "")
home_room = models.CharField(max_length = 5, default = "")
student_enrollment = models.CharField(max_length = 2, default = "")
school_number = models.CharField(max_length = 15, default = "")
email = models.EmailField(default = "")
projected_graduation_year = models.CharField(max_length = 4, default = "")
counseling_goal = models.TextField(max_length = 255)
win_username = models.CharField(max_length = 50)
win_password = models.CharField(max_length = 50)
offsite_laptop = models.BooleanField(default = False, blank = True)
image = models.ImageField(default ="default.png", upload_to ='student_pics')
VIEW:
@login_required
def Rapid_Fire(request, classid):
if request.method == "GET":
date = datetime.date.today()
class_name = Section.objects.filter(sectionpsid=classid)
getstudents = SectionEnrollment.objects.filter(section_id=classid).select_related().values_list('studentpsid_id__student_name', flat = True)
student_selection = getstudents.all().order_by('studentpsid__student_name')
my_class_id = request.session['my_class_id']
sectionpsid = Section.objects.get(sectionpsid = my_class_id)
form = Rapid_Fire_Form()
form.fields["student_name"].queryset = getstudents
form.fields["sectionpsid"].queryset = class_name
context = ({'form': form, 'my_class_id': my_class_id, 'sectionpsid':sectionpsid,})
return render(request, 'points/rapid_fire.html', context )
elif request.method == "POST":
date = datetime.date.today()
class_name = Section.objects.filter(sectionpsid=classid)
getstudents = SectionEnrollment.objects.filter(section_id=classid).select_related().values_list('studentpsid_id__student_name', flat = True)
student_selection = getstudents.all().order_by('studentpsid__student_name')
my_class_id = request.session['my_class_id']
sectionpsid = Section.objects.get(sectionpsid = my_class_id)
form = Rapid_Fire_Form(request.POST)
form.fields["student_name"].queryset = getstudents
form.fields["sectionpsid"].queryset = class_name
if form.is_valid():
# Records logged in user to table
obj = form.save(commit= False)
userid = request.user
obj.created_by = userid
obj.save()
解决方案
看来问题出在这里:
getstudents = SectionEnrollment.objects.filter(section_id=classid).select_related().values_list('studentpsid_id__student_name', flat = True)
student_selection = getstudents.all().order_by('studentpsid__student_name')
是values_list('studentpsid_id__student_name', flat = True)
收集学生name
而不是他们的id
。所以我认为表单字段将是错误数据的字段。如果我是对的,解决方案可能是:
students_id = SectionEnrollment.objects.filter(section_id=classid).select_related().values_list('studentpsid__id', flat = True)
student_selection = Student.objects.filter(id__in=students_id).order_by('student_name')
或者:
student_selection = Student.objects.filter(sectionenrollment_set__section_id=classid).order_by('student_name')
推荐阅读
- reactjs - 组件中的反应函数
- c++ - 为什么浮点值会增加?
- markdown - 为什么这张表会弄乱文档的其余部分?
- ios - 使用具有自动签名的“开发者”帐户上传 iOS 存档会导致配置文件错误
- java - 适用于 Android 的 Azure 通知中心:如何使用后台服务处理数据消息?
- rust - Rust Wasm - The Game Of Life 教程未能编译 webpack-dev-server
- arrays - 是否可以在 3D 阵列的 1D 线性化版本上正确执行多维 FFT?
- python - Python SQLite3 未定义符号:OnUpdateString
- count - 初学者使用计数并得到错误
- kotlin - 如何使用 gradle/kotlin dsl 收集 jar 中的所有子项目代码