我正在使用Django建立一个巴士预订网站。用户在特定路线上搜索公交车后,会显示一个显示可用公交车的列表。每个列表项即总线都有一个书按钮,该按钮通向称为“seat.html”的新页面。我想将公交车号码和其他信息传递到“座位”视图,以便我可以显示可用的座位数量,javascript也可以使用此信息。这是我的代码
views.py
def find_bus(request):
form = forms.FormFindBus
template = 'home.html'
context = {'form': form}
return render(request, template, context)
def select(request):
bus_type = request.GET.get('bus_type')
bus_from = request.GET.get('bus_from')
bus_to = request.GET.get('bus_to')
date_string = request.GET.get('date')
qs = Bus.objects.filter(type_of_bus=bus_type, route__location_from=bus_from, route__location_to=bus_to, date=date_string)
context = {'qs': qs,}
template = 'select.html'
return render(request, template, context)
def seats(request):
template = 'seats.html'
context = {}
return render(request, template, context)
select.html
{% for info in qs %}
<a href="{% url 'book:seats' %}">Book</a>
<ul>
<li><b>Bus Number -</b> {{ info.bus_number }}</li>
<li><b>Route -</b> {{ info.route }}</li>
<li><b>Date -</b> {{ info.date }}</li>
<li><b>Time -</b>{{ info.time }}</li>
</ul>
</div>
{% endfor %}
正如您所见,查询集在select.html中传递,我在其中使用for循环显示所有可用的总线及其信息。然后,我点击书籍预订我想要的巴士选择座位。我希望当我点击书籍时,总线信息也会传递到下一个模板,即seat.html,以便我使用该信息显示可用座位和其他相关信息。这里有一些截图可以帮助你们了解更好的图片。
正如您在第一张图片中看到的那样,用户输入了他的查询。然后在第二张图像中显示总线列表,或者在这种情况下只显示一条总线。然后他点击那辆公共汽车上的书,并显示座位表。如何将“select.html”模板中的信息传递到座位视图。请不要建议使用网址传递信息。它可以很容易地导致操作。
答案 0 :(得分:2)
请不要建议使用网址传递信息。它可以很容易地导致操作。
可悲的是,将信息传递给视图的其他方式并没有那么好或更安全。
永远不要相信用户输入。
无论您最终选择何种方式,都必须验证输入。
使用URL有一些优点。例如:您可以发送指向您刚刚找到的朋友的路线(所谓的深层链接)。否则你的朋友必须自己点击你的表格。
如果您仍然对通过URL执行此操作感兴趣,可以按照以下方式执行此操作:
您可以更改名为module.__file__
的网址的网址架构,以包含所有必需的信息。假设book:seats
中的book:seat
如下所示:
urls.py
您可以更改此网址格式,以包含您要传递到url(r'^book/seats/$', views.seats, name='book:seats')
视图的所有信息:
seats
这会在您的网址格式中添加一个所谓的命名组。您可以在此处阅读有关命名组的信息:named groups documentation。显然,您必须修改此示例网址格式以满足您的需求。
下一步是更新您的视图函数以处理所有这些额外的视图参数:
url(r'^book/seats/(?P<bus_number>\w+)/(?P<route>\w+)/(?P<date>\w+)/(?P<time>\w+)$', views.seats, name='book:seats')
最后一步是修改模板中链接的呈现方式:
def seats(request, bus_number, route, date, time):
template = 'seats.html'
context = {}
return render(request, template, context)
您必须按照<a href="{% url 'book:seats' info.bus_number info.route info.date info.time %}">Book</a>
函数中使用的顺序添加参数。您可以在此处的官方文档中了解更多相关信息:template tag documentation。