我是 django 新手,所以我希望得到您的支持。非常感谢您。
class Province(models.Model):
province_name = models.CharField()
class Employee(models.Model):
first_name = models.CharField()
province = models.ForeignKey(Province, on_delete=models.CASCADE,)
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",
]
class EmployeeListView(FilterView):
model = Employee
queryset = Employee.objects.select_related(
"province",
)
form_class = EmployeeForm
strict = False
context_object_name = "employees_list"
filterset_class = EmployeeFilter
<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 模板的选择下拉列表中呈现
您无法使用 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>