3

I'm very new to Django and I would like to create a drop down box using distinct value of a column in a database:

models.py:

from django.db import models

class SensorsTable(models.Model):
    sensor_uuid = models.CharField(primary_key=True, max_length=32)
    sensor_desc = models.CharField(max_length=256)
    sensor_mid = models.CharField(max_length=256)
    gw_uuid = models.CharField(max_length=32, blank=True, null=True)
    sensor_loc_lat = models.DecimalField(max_digits=11, decimal_places=8, blank=True, null=True)
    sensor_loc_long = models.DecimalField(max_digits=11, decimal_places=8, blank=True, null=True)
    sensor_loc_blg = models.CharField(max_length=100, blank=True, null=True)
    sensor_loc_room = models.CharField(max_length=100, blank=True, null=True)
    sensor_loc_position = models.CharField(max_length=100, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'sensors_table'

    def __str__(self):
        return self.sensor_uuid

I want a drop down list to contain all distinct values of sensor_loc_room and if the user select a room (sensor_loc_room), table displaying all sensors in the room will be displayed.

forms.py

from django.forms import ModelChoiceField
from django import forms
from .models import *


class LocationChoiceField(forms.ModelForm):
    #locations= forms.ModelChoiceField(queryset=InputLocation.objects.all())
    locations = forms.ModelChoiceField(queryset=SensorsTable.objects.all().values_list("sensor_loc_blg").distinct())

This is my current view.py (only use to display a table of all sensors):

from django.shortcuts import render

# Create your views here.

from django.http import HttpResponse
from django.template import loader
from django.shortcuts import render
from django.views.generic.edit import CreateView


from .models import *


#def index(request):
#    return HttpResponse("Smart Uni Analytics Test")


def index(request):
    query_results = SensorsTable.objects.all()
    locationForm = LocationChoiceField()

    context = {
        'query_results': query_results,

    }
    return render(request,'analytics/index.html', context)

And index.html(only use to display a table of all sensors):

<table>

    {% for item in query_results %}
    <tr>
        <td>{{ item.sensor_uuid }}</td>
        <td>{{ item.sensor_desc }}</td>
        <td>{{ item.sensor_mid }}</td>
        <td>{{ item.gw_uuid }}</td>
        <td>{{ item.sensor_loc_blg }}</td>
        <td>{{ item.sensor_loc_room }}</td>
        <td>{{ item.sensor_loc_position }}</td>
    </tr>
    {% endfor %}
</table>

Any advise or guidance would be greatly appreciated. Thanks !

1
  • maybe i'm just really tired but I think this is what you're looking for. Commented Aug 10, 2017 at 8:30

1 Answer 1

8

I managed to create a drop down box using distinct values from a column in a model. In case someone is looking for an answer:

models.py:

class SensorsTable(models.Model):
    sensor_uuid = models.CharField(primary_key=True, max_length=32)
    sensor_desc = models.CharField(max_length=256)
    sensor_mid = models.CharField(max_length=256)
    gw_uuid = models.CharField(max_length=32, blank=True, null=True)
    sensor_loc_lat = models.DecimalField(max_digits=11, decimal_places=8, blank=True, null=True)
    sensor_loc_long = models.DecimalField(max_digits=11, decimal_places=8, blank=True, null=True)
    sensor_loc_blg = models.CharField(max_length=100, blank=True, null=True)
    sensor_loc_room = models.CharField(max_length=100, blank=True, null=True)
    sensor_loc_position = models.CharField(max_length=100, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'sensors_table'

    def __str__(self):
        return self.sensor_uuid

forms.py

from django import forms
from .models import *


class LocationChoiceField(forms.Form):

    locations = forms.ModelChoiceField(
        queryset=SensorsTable.objects.values_list("sensor_loc_blg", flat=True).distinct(),
        empty_label=None
    )

views.py (most simple way)

from django.http import HttpResponse
from django.template import loader
from django.shortcuts import render
from django.views.generic.edit import CreateView
from .forms import *

from .models import *



def index(request):
    query_results = SensorsTable.objects.all()
    location_list = LocationChoiceField()

    context = {
        'query_results': query_results,
        'location_list': location_list,

    }
    return render(request,'analytics/index.html', context)

index.html

<body>

<div class="container">
    <p></p>
    <form method=POST action="">
        {{ location_list }}
    </form>



    <h1>All sensors</h1>
    <table>

        {% for item in query_results %}
        <tr>
            <td>{{ item.sensor_uuid }}</td>
            <td>{{ item.sensor_desc }}</td>
            <td>{{ item.sensor_mid }}</td>
            <td>{{ item.gw_uuid }}</td>
            <td>{{ item.sensor_loc_blg }}</td>
            <td>{{ item.sensor_loc_room }}</td>
            <td>{{ item.sensor_loc_position }}</td>
        </tr>
        {% endfor %}
    </table>
</div>
</body>
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.