У меня возникают проблемы с фильтрацией параметров ManyToManyField на экране добавления администратора Django, основанного на вводе в другое поле в той же форме. Я новичок в Django и не смог использовать какие-либо общие исправления, описанные в другом месте, потому что они все немного отличаются от моей ситуации. Вот моя ситуация:Заполните Django ManyToManyField Options на основе другого поля в Admin
У меня в моем проекте три модели: Class
, Student
и AttendanceRecord
. В Django Admin при добавлении записи посещаемости я хотел бы изменить параметры поля Absent_Students
на основе выбора, сделанного для поля Associated_Class
. Так, например, если выбран Associated_Class
«CS 450», варианты Absent_Students
должны изменить только студентов, чьи class_list включает 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)
я пытался сделать это путем редактирования класса AttendanceRecordAdminForm
и класса AttendanceRecordAdmin
. Моя проблема в том, что при настройке self.fields['Absent_Students].queryset
я не знаю, как получить доступ к выбранному в данный момент Associated_Class
на форме. Я продолжаю получать сообщение об ошибке «AttendanceRecord не имеет ассоциированного_класса». Вот эти классы только обсуждавшиеся во всей своей полноте:
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',)
В принципе, я ищу способ доступа к введенному в настоящее время Associated_Class в форме администратора, так что я могу правильно фильтровать QuerySet.