如何让下拉选择从Django模型中填充模板中的DataTables表?

时间:2018-03-18 21:30:27

标签: django django-models datatables django-forms

希望我能得到一些帮助。我基本上在我的网站上有一个带有表格的页面,并且我的模型从数据库中填充了该表格。我的问题是,我想要一个下拉列表,用户可以选择他们想要查看的数据。我知道我需要使用django形式才能做到这一点,但我一直在寻找,并且一直很难找到我需要做的事情。该表由DataTables和一些BS4样式组成。

现在,我的表格中只填充了我的一个模型(Model1)并且工作得很好,但是我不知道怎样做我想做的选择从下拉列表中,填充不同的模型。我有点理解表单是如何工作的,但我不知道如何按照我的意愿实现它们。我看到的很多东西只是展示如何用一个模型做一个表单。

非常感谢任何形式的例子或指导:)

这是我的models.py:

    class Model1(models.Model):

            date = models.DateTimeField(db_column='Date', primary_key=True, default='', max_length=40) 
            data1 = models.CharField(max_length=40, default='NoData', blank=True, null=True, db_column='data1',)
            data2 = models.CharField(max_length=40, default='NoData', blank=True, null=True, db_column='data2',)
            class Meta:
                    managed = True
                    db_table = 'table1'
            def __str__(self):
            return '%s %s %s' % (str(self.date), self.data1, self.data2,)

    class Model2(models.Model):

            date = models.DateTimeField(db_column='Date', primary_key=True, default='', max_length=40) 
            data1 = models.CharField(max_length=40, default='NoData', blank=True, null=True, db_column='data1',)
            data2 = models.CharField(max_length=40, default='NoData', blank=True, null=True, db_column='data2',)
            class Meta:
                    managed = True
                    db_table = 'table2'
            def __str__(self):
            return '%s %s %s' % (str(self.date), self.data1, self.data2,)

    class Model3(models.Model):

            date = models.DateTimeField(db_column='Date', primary_key=True, default='', max_length=40) 
            data1 = models.CharField(max_length=40, default='NoData', blank=True, null=True, db_column='data1',)
            data2 = models.CharField(max_length=40, default='NoData', blank=True, null=True, db_column='data2',)
            class Meta:
                    managed = True
                    db_table = 'table3'
            def __str__(self):
            return '%s %s %s' % (str(self.date), self.data1, self.data2,)

这是我的views.py:

from app.models import Model1, Model2, Model3
from django.shortcuts import render

def Appview(request):
    template_name = 'app/app.html'

    Model1 = Model1.objects.all()
    Model2 = Model2.objects.all()
    Model3 = Model3.objects.all()
    return render(request, template_name, {'Model1': Model1})

这是我的(简化)app.html:

<div class="table-responsive container">
      <table id = "table" class = "table table-sm table-hover" width="100%">
        <thead>
            <tr>
                <th>Date</th>
                <th>Data1</th>
                <th>Data2</th>
            </tr>
        </thead>

        <tbody>
            {% for data in Model1 %}
            <tr>
                <td>{{ data.date }}</td> 
                <td>{{ data.data1 }}</td>
                <td>{{ data.data2 }}</td>    
            </tr>
            {% endfor %}
        </tbody>
    </table>

问题的真正含义是:如何创建一个用不同模型重新填充视图/模板的下拉表单?

编辑:模型有更多字段,表格比显示的要大得多。我只是简单地修剪了一些东西。看起来更深一点,我想我可能需要使用AJAX?

1 个答案:

答案 0 :(得分:2)

你没有包含你的表格,但它可能就像这样简单:

CACHE_DRIVER=array
SESSION_DRIVER=array
QUEUE_DRIVER=array

然后您将表单放在模板中的某个位置:

class DataForm(forms.Form):
    model = forms.CharField()

在您的视图中,您将处理<form method="get"> {{ form.as_p }} <input type="submit"> </form> 请求:

GET

我没有包含验证(您希望确保def Appview(request): models = { 'model1': Model1, 'model2': Model2, 'model3': Model3, } template_name = 'app/app.html' data = Model1.objects.all() if 'model' in request.GET: form = DataForm(request.GET) if form.is_valid() model = form.cleaned_data['model'] model = models[model] data = model.objects.all() else: form = DataForm() return render(request, template_name, {'data': data, 'form': form}) 存在),但它只是为了给您一个想法。如果您不想要默认模型,逻辑也可能更复杂。