如何在Django中通过URL传递模型选项的静态字符串参数?(Django 2.0)
如何在Django 2.0中通过URL传递模型选项的静态字符串参数
没问题,结合你的Visitor模型配置,我们可以通过以下步骤实现传递'P'或'E'这类合法参数的需求,同时保证URL的健壮性:
1. 配置带参数校验的URL路由
首先,为了避免用户传入无效参数(比如随机字符串),我们应该在URL层面就限制只能匹配'P'或'E'。Django 2.0中可以用re_path(对应旧版的url函数)来实现正则匹配:
from django.urls import re_path from . import views urlpatterns = [ # 正则捕获只能是P或E的visitor_type参数 re_path(r'^(?P<visitor_type>[PE])/visit_information/$', views.visit_information, name='visit-info'), ]
如果你坚持要用path而非正则,也可以自定义路径转换器,但上面的正则方式更直接高效,能提前拦截不符合要求的请求。
2. 在视图中接收并处理参数
接下来在视图函数中接收这个参数,同时最好做一次双重校验(即使URL过滤了,也能避免其他场景下的无效参数),然后用它来处理模型数据:
from django.shortcuts import render from .models import Visitor def visit_information(request, visitor_type): # 从模型的TYPE_CHOICES中获取合法类型集合 valid_types = [choice[0] for choice in Visitor.TYPE_CHOICES] if visitor_type not in valid_types: # 返回404错误页面 return render(request, 'errors/404.html', status=404) # 过滤对应类型的访客记录 filtered_visitors = Visitor.objects.filter(type=visitor_type) # 把数据传递到模板渲染,顺便拿到类型的显示名称(比如'Person') return render(request, 'visit_information.html', { 'visitors': filtered_visitors, 'current_type_label': dict(Visitor.TYPE_CHOICES)[visitor_type] })
3. 模板中生成合法链接(可选)
如果需要在模板里生成指向该路由的链接,直接用url模板标签传入合法参数即可:
<div class="nav-links"> <a href="{% url 'visit-info' visitor_type='P' %}">个人访客信息</a> <a href="{% url 'visit-info' visitor_type='E' %}">员工访客信息</a> </div>
小提示:为什么不用<str:visitor_type>?
如果直接写path('<str:visitor_type>/visit_information/', ...),虽然能接收参数,但无法限制用户输入的内容——比如有人输入/my_app/X/visit_information/,你的视图就会收到无效的X参数,可能导致后续逻辑出错。用正则匹配能让你的接口更健壮,提前拦截无效请求。
内容的提问来源于stack exchange,提问作者Hanny
相关产品推荐
相关产品推荐

