Cương Vũ Thế
Cương Vũ Thế

Reputation: 11

In django template cannot get data from values_list() for select options dropdown

Im django noob here so I would like to get your support. Thank you so much in advanced.

model.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\>

problem

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

Answers (1)

Blaisemart
Blaisemart

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

Related Questions