curiousIT
curiousIT

Reputation: 145

Django dropdown is not populated

I want my dropdown to get populated with values from one of my db tables in my Django project, yet it remains blank and I can't figure out why.

This is my html code of my home.html page:

<select name="regions" id="regions">
    {% for item in regions_list %}
    <option val="{{ item.name_reg }}"> {{ item.name_reg }} </option>    
    {% endfor %}
</select>

models.py:

class data_reg(models.Model):
    id = models.AutoField(primary_key=True)
    name_reg = models.TextField(db_column='NAME_REG', blank=True, null=True) 

    class Meta:
        managed = True
        db_table = 'reg'

views.py:

def MyView(request):
    regions_list = RegionChoiceField()

    query_results_dict = {
        'regions_list': regions_list,
    }

    return render(request,'home.html', query_results_dict)

forms.py:

class RegionChoiceField(forms.Form):

    regions = forms.ModelChoiceField(
        queryset=data_immo.objects.values_list("name_reg", flat=True).distinct(),
        empty_label=None
    )

Upvotes: 0

Views: 527

Answers (3)

curiousIT
curiousIT

Reputation: 145

I managed to make it work and did it by avoiding using forms.py. I simply generated my 'regions_list' variable directly in views.py and only after that it managed to get properly recognized. So this is how it finally looked like:

def MyView(request):
    regions_list = data_immo.objects.values_list("name_reg", flat=True).distinct()

    query_results_dict = {
        'regions_list': regions_list,
    }

    return render(request,'home.html', query_results_dict)

Also, I amended my html code slightly, as per Ken's suggestion:

<select name="regions" id="regions">
    {% for item in regions_list %}
    <option val="{{ item.name_reg }}"> {{ item}} </option>    
    {% endfor %}
</select>

Upvotes: 0

ken
ken

Reputation: 11

I just tested this and it seems to work for me. Can you print the query in your forms.py

print(data_immo.objects.values_list("name_reg", flat=True).distinct())

This will show the query set in your terminal:

<QuerySet ['a_value']>

I find it always good to print at various levels for debugging, fast and easy.

Upvotes: 0

ken
ken

Reputation: 11

when passing ModelChoiceField to context I think the template should be different.

{% for item in regions_list %}
<option val="{{ item.name_reg }}"> {{ item.name_reg }} </option>    
{% endfor %}

change to

{% for item in regions_list %}
{{ item }}
{% endfor %}

or even simpler, just put your form in the template

{{regions_list}}

Hope this works,

Greeting Ken

Upvotes: 1

Related Questions