ModelChoiceField в django admin выдает 'Выберите правильный выбор. Этот выбор не является одним из доступных вариантов.' ошибка

Hej!

Мне нужно поле в админке django, где пользователь может выбирать из заданных вариантов в базе данных. Например, получить список стран и выбрать одну. Но я всегда буду получать сообщение ' Выберите правильный выбор. Этот выбор не является одним из доступных вариантов." ошибка при попытке сохранить новый экземпляр.

#models.py

class PlaceSection(models.Model):
    code = models.CharField(max_length=1)

        def code_str(self):
        return self.code

# admin.py

class InstiForm(forms.ModelForm):
    place_sections = forms.ModelChoiceField(
        PlaceSection.objects.values(),
        widget=Select2Widget,
    )
    

    class Meta:
        model = Something
        fields = [
            "place_section"]


class InstiAdmin(admin.ModelAdmin):
    form = InstiForm
    save_on_top = True
    def save_model(self, request, obj, form, change):
    fieldsets = [
        (
            ("General"),
                {"fields": [
                    "place_sections"
                    ]
                }
            )
        ]

Я получаю правильные варианты в выпадающем списке администратора, но когда я выбираю один и сохраняю, происходит ошибка.

Есть ли у кого-нибудь идея, как это исправить (в админке) Нашел только похожие проблемы без админской части и ни одно решение не сработало для меня.

Помощь будет очень признательна! :)

ModelChoiceField принимает аргумент queryset. В вашем коде это отсутствует.

place_sections = forms.ModelChoiceField(
        PlaceSection.objects.values(),
        widget=Select2Widget,
    )

должно быть следующим:

place_sections = forms.ModelChoiceField(
        queryset=PlaceSection.objects.all(),
        widget=Select2Widget,
    )

И, вероятно, не values(), а .all()

Ознакомьтесь с документацией: https://docs.djangoproject.com/en/3.2/ref/forms/fields/#django.forms.ModelChoiceField

@moddayjob очень помог мне!

Полное решение моей проблемы следующее:

# models.py 

class PlaceSection(models.Model):
    code = models.CharField(max_length=1)

    def code_str(self):
        return self.code

    def __str__(self):
        return f"{self.code}, {self.description_german}"

class Institution(models.Model):
   place_sections = models.ManyToManyField(
        PlaceSection,
    ) 

   def serialize(self):
       return {"place_sections": ", ".join([place.code for place in self.place_sections.all()])}

# admin.py

@admin.register(NaceSection)
class PlaceSectionAdmin(admin.ModelAdmin):
    search_fields = [
        "code",
        "place_sections",
    ]


class InstitutionForm(forms.ModelForm):
        model = Institution 
        fields = [
            "place_sections"
        ]


@admin.register(Institution)
class InstitutionAdmin(admin.ModelAdmin):
    form = InstitutionForm
    save_on_top = True

    fieldsets = ["place_sections"]
    autocomplete_fields = ["place_sections"]
# query.py
def filter_query(form):
    query = Institution.objects.all()
        if form.cleaned_data["place_sections"]:
        place_sections_query = (
            Institution.objects.filter(place_sections__in=form.cleaned_data["place_sections"])
            )
        query = query.intersection(place_sections_query)
# forms.py

class SearchForm(forms.Form):
    place_sections = forms.ModelMultipleChoiceField(
        queryset=PlaceSection.objects.all(), widget=Select2MultipleWidget, required=False)

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