django -фильтр, показывающий объекты модели при запросе элементов внешнего ключа - PullRequest
0 голосов
/ 09 июля 2020

Я создал фильтр , используя django -фильтр , который должен запрашивать поле YearLevel и отображать строки, соответствующие выбранным флажкам (год 8, год 9, год ...).

Хотя фильтр работает немного, поскольку он отображает работающий CharFilter / Field, который Я могу вручную ввести уровень года, и он вернет соответствующую строку / строки; ниже он содержит набор флажков с первичными ключами в качестве меток и ничего не возвращает при выборе.

Filter Form with Checkboxes and CharFilter

My models:

class StudentProfile(models.Model):
    RelatedPersonName = models.CharField(max_length=10)
    RelatedPersonFirstName = models.CharField(max_length=30)
    RelatedPersonFamName = models.CharField(max_length=30)
    StudentLegalName = models.CharField(max_length=30)
    StudentFamName = models.CharField(max_length=30)
    Email = models.CharField(max_length=130)
    Street1  = models.TextField(max_length=30)
    Suburb = models.CharField(max_length=30)
    State = models.CharField(max_length=5)
    PostCode = models.CharField(max_length=6)
    StudentLegalName = models.CharField(max_length=30)
    StudentFamName = models.CharField(max_length=30)
    StudentNo = models.CharField(primary_key=True,max_length=10)
    Class = models.CharField(max_length=6)
    YearLevel = models.CharField(max_length=10)
    objects = StudentProfileManager()
    
class AttendanceQuerySet(models.QuerySet):
    def get_yearlevel(self, yearlevel):
        return self.select_related('BCEID').filter(BCEID_id__YearLevel = yearlevel)

    def get_all_studentprofile(self):
        return self.select_related('BCEID')

class AttendanceManager(models.Manager):
    def get_queryset(self):
        return AttendanceQuerySet(self.model, using=self._db)

    def get_yearlevel(self, yearlevel):
        return self.get_queryset().get_yearlevel(yearlevel)

    def get_all_studentprofile(self):
        return self.get_queryset().get_all_studentprofile()

class Attendance(models.Model):
    BCEID = models.OneToOneField(StudentProfile,primary_key=True,on_delete=models.CASCADE)
    AttendanceRate = models.CharField(max_length=10)
    objects = AttendanceManager()

Filters.py

class YearLevelFilter(django_filters.FilterSet):

    yearlevel = django_filters.ModelMultipleChoiceFilter(
        queryset=Attendance.objects.all().distinct(),
        field_name="StudentNo",
        to_field_name="BCEID",
        widget=forms.CheckboxSelectMultiple(),
        label="Year Level",
        label_suffix="",
    )

    class Meta:
        model = Attendance
        fields = ['BCEID__YearLevel']

Пожалуйста, помогите.

NB. Не обращайте внимания на вары в верблюжьем корпусе.

1 Ответ

0 голосов
/ 10 июля 2020

Получил работу следующим образом:

class YearLevelFilter(django_filters.FilterSet):
   
    YEARLEVELS = (
        ('Year 7', 'Year 7'),
        ('Year 8', 'Year 8'),
        ('Year 9', 'Year 9'),
        ('Year 10', 'Year 10'),
        ('Year 11', 'Year 11'),
        ('Year 12', 'Year 12'),
    )

    BCEID__YearLevel = django_filters.MultipleChoiceFilter(choices=YEARLEVELS, widget=forms.CheckboxSelectMultiple)

    class Meta:
        model = Attendance
        fields = ['BCEID__YearLevel']
...