【问题标题】:Stay on the same html page with output in django与 django 中的输出保持在同一个 html 页面上
【发布时间】:2017-07-13 00:30:13
【问题描述】:

我希望用户在下拉菜单中选择几个产品,然后在同一页面上显示图表。用户应该能够再次从下拉菜单中选择/取消选择选项,然后刷新它,我想留在同一页面中。 My requirement

我已经编写了代码,但是因为对于 django 中的单独视图,我必须有一个不同的 url,它会转到我的下拉菜单不再工作的指定 url。

我已经渲染了与上面相同的显示页面,只是我的 url 不同。

我怎样才能让它工作并保持在同一个网址中。如果可能,使用输出数据重新加载同一页面。下面是我的代码。

index.html:

<div class="container">
    <div class="row">
        <div class="col-md-6">
            <h3>Select products:</h3>
            <form id="selectProduct" role="search" method="get" action="{% url 'selectedproducts' %}">
                <select name="parameters[]" data-placeholder="Choose products" class="chosen-select" multiple tabindex="4">
                    {% for p in productnames %}
                        <option value="{{ p.productname }}"> {{ p.productname }} </option>
                    {% endfor %}
                </select><br/>
                <label for="submit"></label><button id="submit" type="submit" class="btn btn-default">Submit</button>
            </form>
        </div>
    </div>
    <div class="row"></div><br />
        <h3> Distribution of sales in the products:</h3>
    </div>
</div>
<p>{{ productList }}</p>

urls.py

url(r'^products/', views.productList, name='index'),
url(r'^selectedproducts/', views.selectedproducts, name='selectedproducts')

view.py

def productList(request):
    productnames = Products.objects.all()
    context = {
        'productnames': productnames,
    }
    return render(request, 'sales/index.html', context)

def selectedproducts(request):
    p = request.GET.getlist('parameters[]')
    context = {
        'productList': p,
    }
    # --- logic later for chart ------
    return render(request, 'sales/index.html', context)

提前致谢。

【问题讨论】:

  • 我会简单地使用 chart.js.chartjs.org/samples/latest/charts/pie.html 。您可以单击标签和图表交互。无需重新发明轮子。以下是其他选项:chartjs.org/samples/latest 如果您真的想按照您当前的方式进行操作,您必须搜索 Ajax/API 调用。通过 Ajax 调用,您无需重新加载即可从其他站点获取信息。
  • 感谢您的参考,计划仅使用图表 :) 现在我主要专注于在与选择栏相同的页面上显示图表,而不是再次返回进行选择然后刷新图表。

标签: html django


【解决方案1】:

&lt;form id="selectProduct" role="search" method="get" action="{% url 'selectedproducts' %}"&gt; 中更改为 form id="selectProduct" role="search" method="get" action="{% url 'index' %}"> 并混合两个函数,如

def productList(request):
    if request.method == 'GET':
        p = request.GET.getlist('parameters[]')
        k = request.GET('parameters[]')
        productnames = Products.objects.all()
        context = {
            'productList': p, 'productnames': productnames, 'k':k,
        }
        # --- logic later for chart ------    
    else:

        productnames = Products.objects.all()
        context = {
            'productnames': productnames,
        }

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

这将返回到同一页面,如果方法 get 存在,那么如果不只是显示表单,则使用 selectproduct 再次显示表单。让我知道这是否解决了您的问题

在您的模板中编辑

<div class="container">
    <div class="row">
        <div class="col-md-6">
            <h3>Select products:</h3>
            <form id="selectProduct" role="search" method="get" action="{% url 'selectedproducts' %}">
                <select name="parameters[]" data-placeholder="Choose products" class="chosen-select" multiple tabindex="4">
                    {% for p in productnames %}
                        {% if k == p %}
                            <option value=="{{ p.productname }}" selected> {{ p.productname }} </option>
                        {% else%} 
                            <option value="{{ p.productname }}"> {{ p.productname }} </option>
                        {% endif %}
                    {% endfor %}
                </select><br/>
                <label for="submit"></label><button id="submit" type="submit" class="btn btn-default">Submit</button>
            </form>
        </div>
    </div>
    <div class="row"></div><br />
        <h3> Distribution of sales in the products:</h3>
    </div>
</div>
<p>{{ productList }}</p>

【讨论】:

  • 哇,这很有效,今天学到了新东西,非常感谢:)。无论如何我可以保留选择栏中的值,现在提交后该框再次为空白。我发现了一些帖子,但所有帖子都使用 forms.py 或用于 http 帖子而没有获取。
  • 如果您喜欢这个答案,请接受和/或投票@starFire
  • 是的,有办法,给个时间,我会发布,如果答案解决了你的问题,请接受并投票
  • 它的抛出错误:“QueryDict”对象在“k = request.GET('parameters')”这一行中不可调用。 k 是一个列表,所以它不应该是 k = request.GET('parameters[]') 并且 k 将是一个列表,而 p 将是一个产品,那么 k == p 会起作用吗?
  • 尝试使用 k = request.GET['parameters'] 或 k = request.GET.get('parameters')
猜你喜欢
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 2022-10-04
  • 2022-11-29
  • 1970-01-01
  • 2016-06-20
  • 2012-11-21
  • 1970-01-01
相关资源
最近更新 更多