在django模板中无法从values_list()获取数据用于选择选项下拉列表

问题描述 投票:0回答:1

我是 django 新手,所以我希望得到您的支持。非常感谢您。

模型.py

class Province(models.Model):     
        province_name = models.CharField() 

class Employee(models.Model):    
        first_name = models.CharField()    
        province = models.ForeignKey(Province, on_delete=models.CASCADE,)

filters.py(django-filters)

from django_filters import FilterSet, filters
    from .models import (
        Employee,
        Province,
    )

    class EmployeeFilter(FilterSet):
        province_name_multi_select = (
            filters.ModelMultipleChoiceFilter(
                field_name="province_id",
                queryset=Province.objects.values_list("id", "province_name"),  
            )
        )

        class Meta:
            model = Employee
            fields = [
                "id",
                "first_name",
                "province",
            ]

views.py

class EmployeeListView(FilterView):
        model = Employee
        queryset = Employee.objects.select_related(
            "province",
        )
        form_class = EmployeeForm
        strict = False
        context_object_name = "employees_list"
        filterset_class = EmployeeFilter

employee_filter.html

<select class="form-select" name="province_name_multi_select" id="multiple-select-field" multiple\>  
    {% for element in filter.form.province_name_multi_select %}
    {{ element.tag }} \<= **Problem happened here**
    {% endfor %}
    </select\>

问题

以上

{{ element.tag }}
制作
<option value="[1], 'abc province']" </option\>
但我想要它产生的是,你可以猜到
<option value="1" </option\>

values_list (tuple?)
的输出转换为列表以在 django html 模板的选择下拉列表中呈现

django tuples dropdown django-filter select-options
1个回答
0
投票

您无法使用 value_list() 查询在模板上获得所需的结果,因为您想要获取下拉呈现的数据。 Django

value_list
方法返回元组,您需要的是提取下拉选项的各个值,因此请使用
all()
方法来循环遍历省份对象过滤器。这是您的代码片段的修改。

# filters.py
class EmployeeFilter(FilterSet):
    province_name_multi_select = filters.ModelMultipleChoiceFilter(
        field_name="province",
        queryset=Province.objects.all(), # not value_list()
        to_field_name="id"
    )
class Meta:
        model = Employee
        fields = ["id", "first_name", "province"]
#other fields if any :-)

在模板中->稍作修改;

<select class="form-select" name="province_name_multi_select" id="multiple-select-field" multiple>
    {% for element in filter.form.province_name_multi_select.field.queryset %}
        <option value="{{ element.id }}">{{ element.province_name }}</option>
    {% endfor %}
</select>

© www.soinside.com 2019 - 2024. All rights reserved.