如何将数据值从视图传递到 Django 中的模板?
Posted
技术标签:
【中文标题】如何将数据值从视图传递到 Django 中的模板?【英文标题】:How to pass data values from Views to Templates in Django? 【发布时间】:2018-02-03 07:33:33 【问题描述】:目前,我有两个模板:no_results_tickets.html 和 results_tickets.html。第一个模板包含两个下拉菜单,用于选择年份和周数,因此一旦您点击提交按钮,Web 应用程序就会从 Web API 中查找所选周和年的票证,然后在另一个模板中显示结果。
我现在缺少的是如何在第二个模板中显示这些结果。
这是我目前所拥有的。
forms.py
class DropDownMenuForm(forms.Form):
week = forms.ChoiceField(choices=[(x,x) for x in range (1,53)])
year = forms.ChoiceField(choices=[(x,x) for x in range (2016,2021)])
模板 no_results_tickets.html
<h3>Please, select the year and week number to retrieve the data.</h3>
<form id="search_dates" method="POST" action="/results_tickets/"> % csrf_token %
<h6>Select year</h6>
<div class="row">
<div class="col-sm-8">
<select name="select_year">
<option value = form.year></option>
</select>
</div>
<div class="col-sm-8">
<h6>Select week</h6>
<select name="select_week">
<option value= form.week></option>
</select>
<button type="submit">Search</button>
</div>
</div>
</div>
urls.py
url(r'^no_results_tickets/$',views.tickets_results_test, name='no_results_tickets'),
url(r'^results_tickets/$',views.tickets_results_test, name='results_tickets'),
查看
@api_view(['GET','POST',])
def tickets_results_test(request):
if request.method == "GET":
''' Template for displaying the dropdown menus.'''
template_name = 'personal_website/no_results_tickets.html'
form = DropDownMenuForm()
return render(request, template_name, 'form': form)
elif request.method == "POST":
template_name = 'personal_website/results_tickets.html'
year = request.POST.get('select_year', None)
week = request.POST.get('select_week', None)
# ... do stuff ....
data = "labels":days, "days_of_data": count_data
return render(request, template_name, data)
结果在我的控制台中给出,但我希望它们在 results_tickets.html 模板中看到。 我缺少的是从数据字典中检索内容的技能,因此我可以在第二个模板中获取值并绘制它们。
模板 results_tickets.html
<script>
% block jquery %
//I tried to get the content of the dict data with the following code but I was unsuccessful
var days_of_data = []
var label_number_days = []
days_of_data = data.count_data
label_number_days = data.days
function setChart()
var ctx_tickets_per_day = document.getElementById("tickets_per_day")
var tickets_per_day = new Chart(ctx_tickets_per_day,
showTooltips: false,
type:'bar',
data:
labels: label_number_days,
datasets :
[
label: 'User 01',
data: [days_of_data[0],days_of_data[1],days_of_data[2],days_of_data[3],days_of_data[4],days_of_data[5],days_of_data[6]],
backgroundColor: 'rgba(255, 99, 132, 0.6)',
borderColor: '#777',
borderWidth: 1,
hoverBorderWidth: 3,
hoverBorderColor: '#000'
,
....//graph the values for the rest of users
)
% endblock %
</script>
% block content %
<div class ='row'>
<div class="col-sm-12" url-endpoint='% url "tickets_per_day_results" %'>
<div>
<canvas id="tickets_per_day" ></canvas>
</div>
</div>
</div>
% endblock content %
【问题讨论】:
你试过把变量放在 data.which_property_i_want
双标签应该放在哪个部分?
【参考方案1】:
也许您只是缺少data
周围的django 标签
?
此外,您可能需要将 python 字典转换为 json 字符串才能在 js 中使用它:
在views.py中修改为:
import json
...
data = "labels":days, "days_of_data": count_data
my_data = 'my_data': json.dumps(data)
return render(request, template_name, my_data)
如果您要添加到 模板 results_tickets.html:
<script>
% block jquery %
var days_of_data = []
var label_number_days = []
var data = my_data|safe
days_of_data = data.count_data
label_number_days = data.days
....
% endblock %
</script>
它可能会起作用
【讨论】:
我应该把data = data|safe放在哪个部分?脚本内部? 如果它不起作用,请检查console.log(data)
是否能够访问 javascript 中的数据
my_data = json.dumps(data)
产生冲突。我遇到了错误context must be a dict rather than str.
好吧,抱歉,我使用基于函数的视图已经有一段时间了,也许可以试试mydata = 'my_data': json.dumps(data)
无法使用console.log(data)
或console.log(data)
访问数据以上是关于如何将数据值从视图传递到 Django 中的模板?的主要内容,如果未能解决你的问题,请参考以下文章
将值从 Django 视图传递到 AngularJS 插入的模板
如何将值从 django 模板化 html 传递到 ajax