Python 根据管理中的其他字段填充Django ManyToManyField选项
我在Django Admin Add(Django管理员添加)屏幕上根据同一表单上另一个字段的输入筛选ManyToManyField的选项时遇到问题。我是Django新手,无法使用其他地方描述的任何通用修复程序,因为它们都与我的情况略有不同。以下是我的情况: 我的项目中有三个模型:Python 根据管理中的其他字段填充Django ManyToManyField选项,python,django,django-models,django-forms,django-admin,Python,Django,Django Models,Django Forms,Django Admin,我在Django Admin Add(Django管理员添加)屏幕上根据同一表单上另一个字段的输入筛选ManyToManyField的选项时遇到问题。我是Django新手,无法使用其他地方描述的任何通用修复程序,因为它们都与我的情况略有不同。以下是我的情况: 我的项目中有三个模型:类,学生,和AttendenceCord。在Django Admin中,当添加考勤记录时,我想根据为字段关联的\u类所做的选择,更改字段缺席\u学生的选项。因此,例如,如果选择了Associated_Class“CS
类
,学生
,和AttendenceCord
。在Django Admin中,当添加考勤记录时,我想根据为字段关联的\u类
所做的选择,更改字段缺席\u学生
的选项。因此,例如,如果选择了Associated_Class
“CS 450”,则缺席学生的选项应仅更改为班级列表中包含CS 450的学生
以下是我的模型:
from __future__ import unicode_literals
from django.db import models
from django.contrib.auth.models import User
from django.utils.encoding import python_2_unicode_compatible
import random, string
# Create your models here.
#This is the model for a student
@python_2_unicode_compatible
class Student(models.Model):
pass
Student_First_Name = models.CharField(max_length=200)
Student_Last_Name = models.CharField(max_length=200)
Student_ID_Number = models.CharField(max_length=200)
Student_Class = models.ForeignKey('Class', null=True)
def __str__(self):
return self.Student_Last_Name + ',' + self.Student_First_Name
# This is the model for a class
@python_2_unicode_compatible
class Class(models.Model):
class Meta:
verbose_name_plural = "Classes"
Class_Name = models.CharField(max_length=200)
Student_List = models.ManyToManyField('Student', related_name='class_list')
Professor = models.ForeignKey(User,null=True)
AddCode = models.IntegerField
pass
def __str__(self):
return self.Class_Name
def getName(self):
return self.Class_Name
def getProfessor(self):
return self.Professor.id
def getProf(self):
return self.Professor
def getStudents(self):
return self.Student_List
#This is the model for attendance records
class AttendanceRecord(models.Model):
class Meta:
verbose_name = "Attendance Record"
Associated_Class = models.ForeignKey(Class, on_delete=models.CASCADE, related_name='Attendance_Records')
Date = models.DateField()
Absent_Students = models.ManyToManyField('Student', blank=True)
Present_Students = models.ManyToManyField('Student', related_name='a')
def get_associated_class_id(self):
return self.Associated_Class
def __str__(self):
return self.Associated_Class.__str__() + ' on date ' + self.Date.__str__(self)
我尝试通过编辑AttendanceCordAdminForm
类和AttendanceCordAdmin
类来实现这一点。我的问题是,在设置self.fields['缺席学生].queryset
时,我不知道如何访问表单上当前选择的关联类。我一直收到一个错误,“AttendanceCord没有关联的_类”。以下是刚刚讨论的全部课程:
class AttendanceRecordAdminForm(forms.ModelForm):
class Meta:
model = AttendanceRecord
fields = '__all__'
def __init__(self, *args, **kwargs):
super(AttendanceRecordAdminForm, self).__init__(*args, **kwargs)
instance = kwargs.get('instance', None)
self.fields['Absent_Students'].queryset = Student.objects.filter(class_list__id=self.instance.get_associated_class_id())
self.fields['Present_Students'].queryset = Student.objects.filter(class_list__id=1)
class AttendanceRecordAdmin(admin.ModelAdmin):
form = AttendanceRecordAdminForm
filter_horizontal = ('Absent_Students', 'Present_Students',)
基本上,我正在寻找一种方法来访问管理表单上当前输入的关联类,以便能够正确地筛选查询集。经过数小时的在线搜索,我终于找到了我需要的。smart_select应用程序中的大量链接使这一过程变得非常简单。此链接:描述安装过程,并链接到安装后使用它的文档。希望这也能帮助其他人