2017-01-18 11 views
0

同じフォームの別のフィールドへの入力に基づいて、Django管理者の追加画面でManyToManyFieldのオプションをフィルタリングする際に問題が発生しています。私はDjangoを初めて使用しており、私の状況とは少し異なるので、他の場所で説明されている一般的な修正を使用することはできませんでした。ここに私の状況です:管理者の他のフィールドに基づいてDjango ManyToManyFieldオプションを設定する

私のプロジェクトには、3つのモデルがあります:ClassStudent、および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にアクセスする方法を探しています。

答えて

0

オンラインで何時間も検索した結果、私は必要なものを見つけました。 smart_selectアプリケーションのチェインされたManyToManyはこれを非常に簡単にします。このリンク:How to use django-smart-selectはインストールプロセスを説明しており、インストール後に使用するためのドキュメントへのリンクも示しています。うまくいけば、これは他の人にも役立ちます。

関連する問題