Проблема с выбором допустимого варианта. Этот выбор не является одним из доступных вариантов
в моем form.py у меня есть класс StudentsForm:
class StudentsForm(ModelForm):
def __init__(self, *args, **kwargs):
students = kwargs.pop('students')
course = kwargs.pop('course')
super().__init__(*args, **kwargs)
CHOICE_LIST = [('', '----')]
i = 1
for itm in students:
CHOICE_LIST.append((i, itm))
i += 1
self.fields['students'].choices = CHOICE_LIST
self.fields['students'].initial = ['']
self.fields['course'].choices = [(1, course), (2, '----'
)]
self.fields['course'].initial = [1]
class Meta:
model = StudCourse
fields = (
'course',
'students',
)
widgets = {
'course': forms.Select(attrs={'class': 'form-control',
'placeholder': 'Select course',
'style': 'color: crimson; background-color:ivory;'
}),
'students': forms.SelectMultiple(attrs={'class': 'form-control'
, 'placeholder': 'Select students',
'style': 'color: crimson; background-color:ivory;'
}),
}
мой view.py
def test(request):
#team = get_team(request)
# here the second students is a query set of model Student, 2nd course is an object of model #Course
form = StudentsForm(students=students, course=course)
if request.method == 'POST':
form = StudentsForm(request.POST, students=students, course=course)
if form.is_valid():
form.save()
return redirect('home')
if team.exists():
return render(request, 'app/students_goal_form.html', {'form':form})
мой students_goal_form.html
{% block content %}
<section id="students_form">
<div class="row">
<p> </p>
</div>
<div class="row">
<div class="col-3"></div>
<div class="col-6">
<div class="form-group">
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-success">
<i class="icon-circle-arrow-right icon-large"></i> Save
</button>
</form>
</div>
</div>
<div class="col-3"></div>
</div>
<div class="row">
<p> </p>
</div>
<div class="row">
<p> </p>
</div>
<div class="row">
<p> </p>
</div>
</section>
{% endblock %}
Он работает правильно без добавления students=students, course=course в форму (без модификации __init__ ), но мне нужно фильтровать набор запросов в случае students, а также нужен конкретный (только один) course. Я также модифицировал __init__ в форме, чтобы добавить возможность выбрать ничего.
моя модель StudCourse:
class StudCourse(models.Model):
course = models.ForeignKey(Course, verbose_name='Course', on_delete = models.CASCADE, related_name='+', blank=True, null=True, help_text=u'You can choose specific course or group of students')
students = models.ManyToManyField(Student, null=True, blank=True, symmetrical=False, related_name='student_name')
def get_students(self):
return "\n ".join([p.end_user_id for p in self.students.all()])
def __str__(self):
return 'Title: : ' + self.course
Почему у меня возникает ошибка, когда в режиме просмотра форма проходит валидацию: Select a valid choice. That choice is not one of the available choices.
Как изменить мою форму, которая принимает, чтобы ничего не выбирать?
В приведенном выше коде не объясняется подробно, как генерируется содержимое для переменной students, которую вы передаете форме, но я предполагаю, что проблема может быть там.
Список вариантов для поля студента генерируется таким образом, что в каждой паре (id, объект) id является номером в последовательности, но не реальным id объекта.
CHOICE_LIST = [('', '----')]
i = 1
for itm in students:
CHOICE_LIST.append((i, itm))
i += 1
self.fields['students'].choices = CHOICE_LIST
Вместо этого, вы должны использовать первичный ключ в качестве id, чтобы отразить структуру вашей базы данных
CHOICE_LIST.append((itm.pk, itm))