#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.