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)