使用json装饰器进行django视图所需的参数 - 如何?

时间:2014-10-20 15:48:15

标签: javascript python json django jqplot

我有一个django页面( search_form.html ),其中包含一个表单文本字段/按钮,用于触发一个操作,并使用输入的值搜索数据库。结果显示在另一个django页面上( search_results.html )。 search_form.html 的表单摘要如下所示:

    <form action="/datest/partner_search/" method="get">
        <label class="control-label">Partner ID</label>
        <input type="text" name="partnerQ">
        <input type="submit" value="Partner Search">
    </form>

我的应用 urls.py

中有以下内容
url(r'^search_form/$', views.search_form, name='search_form'),
url(r'^search_results/$', views.search_results, name='search_results'),

我在 views.py

中有以下内容
def partner_search(request):
    error = False
    if 'partnerQ' in request.GET:
        q = request.GET['partnerQ']
        if not q:
            error = True
        else:
            my_data = MyTable.objects.filter(dbField__icontains=q)
            return render(request, 'myapp/search_results.html', {'mydata': my_data, 'query': q})
    return render(request, 'myapp/search_form.html', {'error': error})

这样可行,但是当我想在结果页面中包含jqplot图形时,我的问题出现了,但是要在图形上绘制的数据需要基于传递给上述views.py方法的partnerQ字符串的数据库查询。所以我有一个单独的方法,用于在我的views.py中为jqplot创建JSON数据。因此, urls.py 中的附加条目如下所示:

url(r'^my_plot_json/$', views.my_plot_json, name='my_plot_json'),

views.py 方法(仍需要搜索字段中的字符串 - 不知道如何捕获它)如下所示。注意 - 我知道这不会起作用,因为我没有通过q

@render_to_json()
def my_plot_json(request):
    mydata = MyTable.objects.values("iDate").filter(dbField__icontains=q).annotate(Count("id"))
    jsondataset = [[str(z['iDate']), z['id__count']] for z in mydata]
    return [jsondataset]

相应的javascript代码段如下所示:

function populateGraph() {
    $.get('/myapp/my_plot_json', function(data) { drawTwelveMonthPlot(data); });
}

所以我的问题总结是这个_我需要执行一个单独的数据库查询来为我的jqPlot图生成JSON数据但我无法弄清楚如何捕获在my_plot_json的表单字段中输入的搜索字符串方法。我看到的选项可能是:

  1. 通过 partner_search 方法调用 my_plot_json 来传递字符串?
  2. 有两个操作归因于我的表单字段,因此两个例程都被触发了吗?
  3. 我不知道其中任何一个是否可能并且不可否认,我是一个python / django新手,所以如果可能的话,我会很感激代码片段式解决方案。非常感谢提前。

1 个答案:

答案 0 :(得分:0)

我想到了各种解决方案,但最简单的方法就是在partner_search方法本身生成json,并将其与其他参数一起传递给模板。然后,您可以直接使用该数据调用drawTwelveMonthPlot,而不是为它单独发出Ajax请求。

修改

我真的没有看到你不明白的东西。你有一个函数populateGraph,它只包含一个Ajax调用,并且该Ajax调用的结果被传递给drawTwelveMonthPlot。因此,您可以简单地从该Ajax调用中调用drawTwelveMonthPlot并直接调用它,并从模板中传递JSON。

function populateGraph() {
    var data = '{{ json_data_from_view|safe }}'
    drawTwelveMonthPlot(data);
}

这假设JS在你的Django模板中;如果不是,您只需将var data...行放在模板中的<script>元素中,其余部分仍可使用。