0

嘿!

我想在我的 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"
                    ]
                }
            )
        ]

我确实在管理下拉列表中得到了正确的选择,但是当我选择一个并保存时,就会发生错误。

有没有人知道如何解决这个问题(在管理员中)发现只有类似的问题没有管理部分并且没有解决方案对我有用。

非常感谢您的帮助!:)

编辑:

我在我的管理区域中修复了这个问题,但现在无法在我的表单/视图中过滤 PlaceSection。需要的字段在那里,但在“搜索”之后,TypeError 'PlaceSection' 对象不可迭代。它似乎是 NoneType 并且是空的,但我不明白我做错了什么。

任何进一步的帮助也将不胜感激!:)

# forms.py

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

# views.py

def search_institution(request):
    if request.method == "POST":
        form = SearchForm(request.POST)
        if form.is_valid():
            query = filter_query(form)
            context = {"result_data": serialize(query), "form": form, "show_form": False}
            return render(request, "stakeholders/search_form.html", context)
    else:
        form = SearchForm()

    context = {
        "result_data": serialize(Institution.objects.all()),
        "form": form, 
        "show_form": True
    }
    return render(request, "stakeholders/search_form.html", context)

# query.py

def filter_query(form):
    query = Institution.objects.all()
    if form.cleaned_data["place_sections"]:
        place_sections_query = Institution.objects.none()
        for section in form.cleaned_data["place_sections"]:
            place_sections_query = (
                    place_sections_query
                    | Institution.objects.filter(place_sections__in=section)
            )
        query = query.intersection(place_sections_query)
    return query

4

2 回答 2

1

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

于 2021-09-02T14:07:24.740 回答
0

@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)

于 2021-09-03T12:39:04.553 回答