同じフォームの別のフィールドへの入力に基づいて、Django管理者の追加画面でManyToManyFieldのオプションをフィルタリングする際に問題が発生しています。私はDjangoを初めて使用しており、私の状況とは少し異なるので、他の場所で説明されている一般的な修正を使用することはできませんでした。ここに私の状況です:管理者の他のフィールドに基づいてDjango ManyToManyFieldオプションを設定する
私のプロジェクトには、3つのモデルがあります:Class
、Student
、およびAttendanceRecord
です。 Django Adminでは、出席記録を追加するときに、Associated_Class
の選択に基づいて、フィールドAbsent_Students
のオプションを変更したいと思います。
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)
私はこれをやって試してみました:Associated_Class
「CS 450」が選択されているのであれば、例えば、Absent_Students
のオプションは、そのclass_list CS 450ここ
は私のモデルですが含ま学生のみに変更する必要がありますAttendanceRecordAdminForm
クラスとAttendanceRecordAdmin
クラスを編集します。私の問題は、self.fields['Absent_Students].queryset
を設定すると、フォーム上の現在選択されているAssociated_Class
にアクセスする方法がわかりません。私は "AttendanceRecordにAssociated_Classがない"というエラーが出ています。ここでは単にそれらの全体で議論これらのクラスは以下のとおりです。基本的には
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にアクセスする方法を探しています。