Reputation: 11
Im django noob here so I would like to get your support. Thank you so much in advanced.
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\>
Above {{ element.tag }}
produced <option value="[1], 'abc province']" </option\>
But what I want it to produce is, you can guess that <option value="1" </option\>
convert output of values_list (tuple?)
to list to render in django html template's select dropdown
Upvotes: 1
Views: 54
Reputation: 413
The desired result you want can't be achieved with the usage of value_list()
query method because it only returns tuples, use all() query instead to better extract the individual values of the dropdown options. On the template, you can now loop through the Province objects filter. Your code snippet modification will look like this below when we make those changes.
# 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 :-)
<!--templates.html-->
<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>
Upvotes: 0