【问题标题】:Django forms and passing data between views/pagesDjango 表单和在视图/页面之间传递数据
【发布时间】:2015-05-20 21:50:04
【问题描述】:

我正在创建一个网络应用程序,主页是用户选择其位置的地方。主页模板的视图查询我的数据库以获取位置列表并填充下拉列表。用户点击提交后,我验证表单数据,如果他们选择了一个有效的城市(即它存在于我的数据库中),我想将它们重定向到显示该城市当天交易的另一个页面。我的问题基于 Django 中的基本视图/表单设计。我怎样才能将城市传递到下一页?基本上我想做以下事情:

主页 -> 提交表单 -> 调用验证表单的方法 -> 表单将用户重定向到另一个页面

我是否必须创建单独的验证视图/页面进行验证?表单带有一个动作参数,所以我猜我必须将动作设置为 /validate/,这将调用我的 validate_form() 方法(通过 urls.py 文件),然后将它们重定向到适当的页面。

我只是想在我继续实施之前先让某人运行我的想法。感谢您的宝贵时间。

【问题讨论】:

  • 您已经从 db 填充(在 dd 列表中)有效值,为什么要再次验证它们?
  • 如果有人做前端注入,并将城市的价值设置为我提供的以外的东西......
  • 然后继续进行 catavaran 所说的后端验证

标签: python django forms validation


【解决方案1】:

为什么要验证城市?只需重定向到城市,如果城市不存在,则会显示 404 页面。

您的模板

<form action="{% url 'choose_city' %}" method="POST">
    <select name="city">
    {% for city in cities %}
        <option value="{{ city.id }}">{{ city.name }}</option>
    {% endfor %}
    </select>
    <button>Show deals</button>
</form>

urls.py

url(r'^choose/$', views.choose_city, name='choose_city'),
url(r'^deals/(?P<city_id>\d+)/$', views.deals_by_city, name='deals_by_city'),

views.py

from django.shortcuts import get_object_or_404, redirect, render

def choose_city(request):
    return redirect('deals_by_city', city_id=request.POST['city'])

def deals_by_city(request, city_id):
    city = get_object_or_404(City, pk=city_id)
    deals = Deal.objects.filter(city=city)
    return render(request, 'deals_by_city.html', {'city': city,
                                                  'deals': deals})

【讨论】:

  • 另一个问题:我想使用会话来存储用户的城市,所以当他们浏览网站时,城市被保存了。我将 request.session['city'] 设置为用户城市,但在视图之间导航时遇到问题。如何维护会话变量?
  • 您可以在任何地方获得request.session.get('city') 的意见。如果用户没有选择城市,那么你会得到None
  • 谢谢。我会再试一次。
猜你喜欢
  • 2015-06-29
  • 2011-12-07
  • 2019-11-06
  • 1970-01-01
  • 2015-12-23
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多