Как показать только подмножество опций в выпадающем меню Django

У меня есть приложение, которое позволяет пользователям записываться и регистрироваться на курсы (из модели 'TrainingInstance'). Эти события имеют имена и т.д. и классифицируются как прошлые или текущие в базе данных (в модели 'Training'). Когда я показываю форму BuildOrderForm в моем шаблоне, я хочу, чтобы в выпадающем меню отображались только варианты текущих тренингов. Как это можно сделать в Django без javascript или Ajax?

У меня есть следующая форма в файле forms.py:

class BuildOrderForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ['training_registered']

И следующие модели в models.py:

class Training(models.Model):
    """ Model which specifies the training category (name) and whether they are Past or Present""" 
        YEAR = (
            ('current', 'current'),
            ('past', 'past'),
            )
        name = models.CharField(max_length=200, null=True)
        year= models.CharField(max_length=200, null=True, choices=YEAR, default='current')
        def __str__(self):
            return self.name

class TrainingInstance(models.Model):
    """ Creates a model of different instances of each training ( May 2021 etc) """

    name = models.CharField(max_length=200, null=True, blank=True)
    venue = models.CharField(max_length=200, null=True, blank=True)
    training = models.ForeignKey(Training, on_delete= models.CASCADE, null = True)
    
    training_month = models.CharField(max_length=200, null=True, blank=True)
    participant_date = models.CharField(max_length=20, null=True, blank=True)
    staff_date = models.CharField(max_length=20, null=True, blank=True)
    graduation_date = models.CharField(max_length=200, null=True, blank=True)
    
    def __str__(self):
        return self.name
    
class Order(models.Model):
    REGSTATUS = (
        ('registered', 'registered'),
        ('enrolled', 'enrolled'),
        ('holding', 'holding'),
        ('withdrawn', 'withdrawn'),
        ('waiting', 'waiting'),
        )

    customer = models.ForeignKey(Customer, on_delete= models.CASCADE, null = True)
    training_registered = models.ForeignKey(TrainingInstance, on_delete= models.SET_NULL, blank = True, null = True)
    registration_date = models.DateTimeField(null=True,blank=True)

    regstatus = models.CharField(max_length=200, null=True, choices=REGSTATUS, default='registered')

    def __str__(self):
        return self.customer.username

Вот что я сделал - и это работает, но я также открыт для отзывов о хорошей/плохой практике.

class BuildOrderForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ['training_registered']
    
    def __init__(self,*args,**kwargs):
        super (BuildOrderForm,self ).__init__(*args,**kwargs)
        self.fields['training_registered'].queryset = TrainingInstance.objects.filter(training__year ="current")
Вернуться на верх