2017-08-11 130 views
0

我想显示基于下拉框选择过滤的模型中的表格。我使用表单创建了一个下拉列表。下拉列表中的值是sensor_loc_blg的不同值。如果用户从下拉框中进行选择,那么将过滤显示所有具有sensor_loc_blg作为选定值的行的表。Django - 基于下拉框选择过滤和显示模型

以下是我的尝试:

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

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): 
# return HttpResponse("Smart Uni Analytics Test") 


def index(request): 

    if request.method =='POST': 
     location_list = LocationChoiceField(request.POST) 

     if location_list.is_valid(): 
      selected_location = location_list.cleaned_data['locations'] 
      query_results = SensorsTable.objects.filter(sensor_loc_blg= selected_location) 

     else: 
      location_list = LocationChoiceField() 
      query_results = SensorsTable.objects.all() 

    else: 
     location_list = LocationChoiceField() 
     query_results = SensorsTable.objects.all() 




    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> 

我对此很新。有人能告诉我这里有什么问题吗?我需要为此使用Ajax吗?

+0

如果你的罚款,重新加载页面,它有没有问题,这样做与Django的。但是如果你只想改变query_result部分而不重新加载整个页面,当然你需要使用Ajax。 – Jayground

回答

0

解决方案

views.py

def index(request): 


    location_list = LocationChoiceField() 

    if request.GET.get('locations'): 
     selected_location = request.GET.get('locations') 
     query_results = SensorsTable.objects.filter(sensor_loc_blg=selected_location) 
    else: 
     query_results = SensorsTable.objects.all() 


    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="get" action="{% url 'index' %}"> 
     {{ location_list }} 
     <input type="submit" > 
    </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>