Django MultiSelectField Selected Choice выдает ошибку "Not a Valid Choice"

Я новичок в Django и у меня есть поле MultiSelectField в моей модели питания. Я также использую поле MultipleChoiceField с виджетом CheckBoxSelectMultiple в моей форме Meal Form. Когда я выбираю флажок в шаблоне и размещаю форму, я получаю ошибку, которая гласит: "[ValidationError(["Значение ['CHICKEN CASSEROLE'] не является правильным выбором."])]}). Я задаюсь вопросом, что я делаю неправильно, и мне нужна помощь, чтобы разобраться в этом. Любая помощь будет принята с благодарностью. Ниже приведен мой код для модели и формы:

class Meal(models.Model):
day = models.CharField(max_length=255, blank=True)
category = models.CharField(max_length=100, blank=True)
meal_time = models.TimeField(null=True, blank=True, verbose_name='Meal Time')
recipes = MultiSelectField(max_length=5000, choices=[], null=True)
meal_id = models.IntegerField(null=True, blank=True)
menu = models.ForeignKey(Menu, on_delete=models.CASCADE, null=True, blank=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)

def __str__(self):
    return "%s %s %s %s" % (
        self.day, self.category, self.meal_time, self.recipes)

class Meta:
    app_label = "mealmenumaster"
    managed = True

class MealForm(forms.ModelForm):
day = DynamicChoiceField(choices=[], required=False)
category = forms.ChoiceField(choices=(('', 'None'),) + CATEGORY, required=False)
recipes = forms.MultipleChoiceField(label="Select Recipe(s)",
                                    widget=forms.CheckboxSelectMultiple(), required=False)
meal_id = forms.CharField(widget=forms.HiddenInput(), required=False)

class Meta:
    widgets = {'meal_time': TimeInput()}
    model = Meal
    fields = ['day', 'category', 'meal_time', 'recipes', 'meal_id']
    app_label = "mealmenumaster"

def __init__(self, *args, **kwargs):
    user_id = kwargs.pop('user_id', None)
    super(MealForm, self).__init__(*args, **kwargs)
    self.fields['recipes'].choices = [(x.name, x.name) for x in Recipe.objects.filter(user_id=user_id).order_by(Lower('name'))]
    self.fields['meal_id'].initial = "0"
    self.helper_meal = FormHelper()
    self.helper_meal.form_tag = False
    self.helper_meal.layout = Layout(
        Row(
            Div(
                Field('day', css_class='form-control'),
                css_class='form-group col-md-3 mb0'),
            Div(
                Field('category', css_class='form-control'),
                css_class='form-group col-md-4 mb0'),
            Div(
                Field('meal_time', css_class='form-control'),
                css_class='form-group col-md-4 mb0'),
            css_class='form-group col-md-12 mb0'
        ),
        Row(
            Div(
                Field('recipes', css_class="scrollbar-y"),
                Field('meal_id', id='meal_id'),
                css_class='form-group col-md-8 mb0'),
            css_class='form-group row-md-10 mb0'),
    )

И часть моего мнения:

current_user = request.user
user_id = current_user.id
meal_form = MealForm(request.POST, user_id=request.user.id)
if meal_form.is_valid():
    menu_id = request.POST.get('menu_id')
    if menu_id == "":
        messages.error(request, "Create and Save Menu Before Adding Meal(s)")
        return redirect('menu')
    else:
        meal_id = meal_form.cleaned_data['meal_id']
        category = meal_form.cleaned_data['category']
        meal_time = meal_form.cleaned_data['meal_time']
        recipes = meal_form.cleaned_data['recipes']
        # get recipes for recipe id
        if len(recipes) == 1:
            recipes_list = recipes[0]
        else:
            recipes_list = ', '.join(recipes)
        try:
            existing_meal = Meal.objects.get(id=int(meal_id))
            meal_form = MealForm(request.POST, instance=existing_meal)
            # update meal object
            saved_meal = meal_form.save(commit=False)
            saved_meal.category = category
            saved_meal.meal_time = meal_time
            saved_meal.recipes = recipes_list
            saved_meal.save()
            messages.success(request, "Meal Updated")
            return HttpResponseRedirect(reverse('menu', args=(),
                                                kwargs={'menu_id': menu_id}))
        except Meal.DoesNotExist:
            # create new meal object
            new_meal = meal_form.save(commit=False)
            # set user foreign key
            new_meal.user_id = user_id
            new_meal.menu_id = int(menu_id)
            # save meal
            new_meal.save()
            new_meal.meal_id = new_meal.id
            new_meal.recipes = recipes_list
            new_meal.save()
            messages.success(request, "Meal Added")
            return HttpResponseRedirect(reverse('menu', args=(),
                                                kwargs={'menu_id': menu_id}))
else:
    error = meal_form.errors.as_data()
    message = "Form Error:", error
    messages.error(request, message)
    return render_forms(request)

Я смог решить эту проблему, добавив фактический выбор в поле Model. Например: RECIPES = [(x.pk, x.name) for x in Recipe.objects.filter().order_by(Lower('name'))] добавлены как варианты выбора в модели для поля MultiSelectField "recipes"

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