Проблема с выбором допустимого варианта. Этот выбор не является одним из доступных вариантов

в моем 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>&nbsp</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>&nbsp</p>
    </div>
    <div class="row">
        <p>&nbsp</p>
    </div>
    <div class="row">
        <p>&nbsp</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))

Вернуться на верх