【问题标题】:Pass data from template to view in Django将数据从模板传递到 Django 中的视图
【发布时间】:2017-04-28 18:07:15
【问题描述】:

我正在使用 Django 构建一个巴士预订网站。用户在特定路线上搜索巴士后,会显示一个显示可用巴士的列表。每个列表项,即公共汽车都有一个书籍按钮,该按钮指向名为“seats.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)

选择.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”模板中的信息传递到席位视图。请不要建议使用 url 传递信息。它很容易导致操纵。

【问题讨论】:

    标签: javascript html django


    【解决方案1】:

    请不要建议使用 url 传递信息。它很容易导致操纵。

    遗憾的是,将信息传递给视图的所有其他方式并没有那么好或更安全。

    永远不要相信用户输入。

    无论你最终选择哪种方式,你都必须验证输入。

    而且使用 URL 有一些优势。例如:您可以将刚刚找到的路线的链接发送给朋友(所谓的深层链接)。否则您的朋友将不得不自己点击您的表单。


    如果您仍然对通过 URL 执行此操作感兴趣,可以按以下方式进行:

    您可以更改您称为 book:seats 的 URL 的 url 架构以包含所有必需的信息。假设book:seat 在您的urls.py 中如下所示:

    url(r'^book/seats/$', views.seats, name='book:seats')
    

    您应该更改此 URL 模式以包含您要传递给 seats 视图的所有信息:

    url(r'^book/seats/(?P<bus_number>\w+)/(?P<route>\w+)/(?P<date>\w+)/(?P<time>\w+)$', views.seats, name='book:seats')
    

    这会将一个所谓的命名组添加到您的 URL 模式中。您可以在此处阅读有关命名组的信息:named groups documentation。显然,您必须修改此示例 URL 模式以满足您的需要。

    下一步是更新您的视图函数以处理所有这些额外的视图参数:

    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>
    

    您必须按照在seats 函数中使用的顺序添加参数。您可以在此处的官方文档中阅读更多相关信息:template tag documentation。

    【讨论】:

    • 这绝对是一种可靠的方法,但是 OP 特别要求该方法不通过 URL 传递信息。编辑:看起来你已经读懂了我的想法
    • @Written 我知道。我读得太晚了。感谢您的澄清。我编辑了我的帖子,以向 OP 提供有关此要求的一些反馈。
    猜你喜欢
    • 2020-03-19
    • 2019-02-16
    • 1970-01-01
    • 2015-09-18
    • 2015-07-07
    • 2018-02-10
    • 2018-02-03
    • 2014-08-28
    • 2021-02-03
    相关资源
    最近更新 更多