将数据从模板传递到Django中的视图

时间:2017-04-28 18:07:16

标签: javascript html django

我正在使用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,以便我使用该信息显示可用座位和其他相关信息。这里有一些截图可以帮助你们了解更好的图片。

This is home page where user enter his query A list of buses available is displayed

Seats are displayed

正如您在第一张图片中看到的那样,用户输入了他的查询。然后在第二张图像中显示总线列表,或者在这种情况下只显示一条总线。然后他点击那辆公共汽车上的书,并显示座位表。如何将“select.html”模板中的信息传递到座位视图。请不要建议使用网址传递信息。它可以很容易地导致操作。

1 个答案:

答案 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