Django — использование запроса, чтобы определить, какие варианты использовать для поля

#django #django-forms

Вопрос:

В моем приложении пользователь выбирает несколько параметров, и они сохраняются как GradeBookSetup объект. Одним из параметров является список кортежей для a choice .

У меня есть форма для Grade объектов, и grade.score она определяется выбором. Используемые варианты основаны на вышеупомянутом GradeBookSetup объекте. Я хотел бы, чтобы в форме использовался список вариантов, основанный на настройке GradeBookSetup. В приведенном ниже коде вы увидите в представлении, с помощью которого определяется этот параметр gradescale = GradeBookSetup.objects.get(user=request.user) , и поле gradescale.scale_mode может быть передано в форму.

Первоначально я думал, что смогу выполнить вышеуказанный запрос в форме, но затем я узнал, что это невозможно. Поэтому я думаю, что передаю это gradescale.scale_mode __init__ методу в форме, но я не знаю, как/смогу ли я включить это в свои операторы if / elif в форме.

views.py

 def addsinglegrade(request, classroom_id, student_id):
    c = Classroom.objects.get(id=classroom_id)
    s = Student.objects.get(id=student_id)
    course = Course.objects.get(classroom=classroom_id)
    gradescale = GradeBookSetup.objects.get(user=request.user)
    objective_list = Objective.objects.all().filter(course=course)
    objective_tuple = [(o.id, o.objective_name) for o in objective_list]
    form = SingleGradeForm(objs=objective_tuple, gradescale=gradescale.scale_mode)
    context = {'student': s}
    context['classroom'] = c
    context['form'] = form

    if request.method == 'POST':
        .......
 

forms.py

 class SingleGradeForm(forms.Form):
    """ form for adding in one single grade for a student. """
    SCORE_CHOICES_1 = (
        ('I', 'Incomplete'),
        ('BEG', 'Beginning'),
        ('DEV', 'Developing'),
        ('APP', 'Applying'),
        ('EXT', 'Extending'),
    )
    SCORE_CHOICES_2 = (
        ('I', 'Incomplete'),
        ('EMG', 'Emerging'),
        ('DEV', 'Developing'),
        ('PRF', 'Proficient'),
        ('EXT', 'Extending'),
    )
     SCORE_CHOICES_3 = (
        ('I', 'Incomplete'),
        ('BEG', 'Beginning'),
        ('DEV', 'Developing'),
        ('APP', 'Applying'),
        ('APP ', 'Applying '),
        ('EXT', 'Extending'),
    )
    SCORE_CHOICES_4 = (
        ('I', 'Incomplete'),
        ('EMG', 'Emerging'),
        ('DEV', 'Developing'),
        ('PRF', 'Proficient'),
        ('PRF ', 'Proficient '),
        ('EXT', 'Extending'),
    )
    if gradescale.scale_mode == 'VSB':
        score = forms.ChoiceField(choices=SCORE_CHOICES_1)
    elif gradescale.scale_mode == 'MOE':
        score = forms.ChoiceField(choices=SCORE_CHOICES_2)
    elif gradescale.scale_mode == 'VSBPLUS':
        score = forms.ChoiceField(choices=SCORE_CHOICES_3)
    elif gradescale.scale_mode == 'MOEPLUS':
        score = forms.ChoiceField(choices=SCORE_CHOICES_4)

    objective = forms.ChoiceField(label='Learning Objectives', choices=[])

    time_created = forms.DateField(widget=forms.TextInput(
        attrs={'type': 'date'}), label='Assessment Date')

    def __init__(self, *args, **kwargs):
        print(kwargs)
        choices = kwargs.pop('objs')
        gradescale = kwargs.pop('gradescale')
        self.user = kwargs.pop('user')
        super(SingleGradeForm, self).__init__(*args, **kwargs)
        self.fields['objective'] = forms.ChoiceField(
            choices=choices)
 

models.py

 class Grade(models.Model):
    """Each time a new score is added we create a grade object to track history of grades"""
    score = models.CharField(max_length=3, blank=True, default=I)
    assessment = models.ForeignKey(
        Assessment, on_delete=models.CASCADE, null=True, blank=True)
    objective = models.ForeignKey(
        Objective, on_delete=models.CASCADE, blank=True)
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    cblock = models.ForeignKey(Classroom, on_delete=models.CASCADE, default=1)
    time_created = models.DateField(
        auto_now=False, auto_now_add=False, default=timezone.now)
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)

class GradeBookSetup(models.Model):
    """ gradebook defaults for all classes """
    user = models.OneToOneField(CustomUser, on_delete=CASCADE, primary_key=True )
    # percent if all grades were Level 1, Level 2, etc
    l1 = models.IntegerField(default=55)
    l2 = models.IntegerField(default=70)
    l3 = models.IntegerField(default=82)
    l4 = models.IntegerField(default=100)
    l5 = models.IntegerField(default=90)

    #VSB or ministry words. Additional proficent  category
    VSB = 'VSB'
    VSBPLUS = 'VSBPLUS'
    MOE = 'MOE'
    MOEPLUS = 'MOEPLUS'
    SCALEMODE = [
        ('VSB', 'BEG DEV APP EXT'),
        ('VSBPLUS', 'BEG DEV APP APP  EXT'),
        ('MOE', 'EMG DEV PRF EXT'),
        ('MOEPLUS', 'EMG DEV PRF PRF  EXT'),
    ]
    scale_mode  = models.CharField(max_length=7, choices=SCALEMODE, blank=True, default=VSB)
 

Я думаю, что мог бы создать эту функциональность с помощью javascript, но, надеюсь, для этого есть более чистый способ django.