2017-01-18 5 views
0

У меня возникают проблемы с фильтрацией параметров 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.

ответ

0

После нескольких часов работы в Интернете я, наконец, нашел то, что мне нужно. Прикованный ManyToMany от приложения smart_select делает это очень легко. Эта ссылка: How to use django-smart-select описывает процесс установки, а также ссылки на документацию для ее использования после его установки. Надеюсь, это поможет и другим.

Смежные вопросы