url的path中传入id参数的用法

一. url

"""定义learning_logs的URL模式"""
urlpatterns = [
    # 主页
    url(r'^$',views.index,name='index'),
    # 显示所有的主题
    url(r'^topics/$',views.topics,name='topics'),
    # 特定主题的详细页面
    url(r'^topics/(?P<topic_id>\d+)/$',views.topic,name='topic'),
    url(r'^new_topic/$',views.new_topic,name='new_topic'),
    url(r'^new_entry/(?P<topic_id>\d+)/$',views.new_entry,name='new_entry'),
    ]

其中url(r’^topics/$’,views.topics,name=‘topics’)不需要指定ID,直接导向视图函数topics。

二. views部分代码

def topics(request):
    """显示所有主题"""
    topics = Topic.objects.order_by('date_added')
    context = {'topics' : topics}
    return render(request,'learning_logs/topics.html',context)
    

其中变量topics = Topic.objects.order_by(‘date_added’)存储了所有主题项目,并通过context渲染到topics.html。

三. 前端

topics.html部分代码

    {% for topic in topics %}
      <li>
          <a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
      </li>

遍历变量topics中的项目并创建到对应主题的链接,其中提供了实参topic.id即遍历时每个主题的ID,生成的链接样式如http://127.0.0.1:8000/topics/1/

四、定义显示特定主题的页面

上文urls.py里 url(r’^topics/(?P<topic_id>\d+)/$’,views.topic,name=‘topic’),捕获/topics/1/中的那个topic.id并存储到变量topic_id,再传递给视图函数views.topic

def topic(request,topic_id):
    """显示单个主题及其所有的条目"""
    topic = Topic.objects.get(id=topic_id)
    entries = topic.entry_set.order_by('-date_added')
    context = {'topic' : topic,'entries' : entries}
    return render(request,'learning_logs/topic.html',context)

topic = Topic.objects.get(id=topic_id),此时topic_id用来获取特定主题,最后完成渲染页面

五. 总结

从所有主题页面点击特定主题并显示,其中主题ID的传递流程:

视图函数topics获取所有主题然后渲染到topics.html

topics.html遍历所有主题并获取每个主题的id,存储到变量topic.id,同时生成如下格式的链接http://127.0.0.1:8000/topics/1/

访问topics.html每个主题链接时,通过url模式捕获topic.id存储到变量topic_id再传递给视图函数topic

视图函数topic渲染指定主题的页面

原文链接:https://blog.csdn.net/PanWeiBoWUHA/article/details/105876025

posted @ 2023-01-10 13:46  坚强的小蚂蚁  阅读(338)  评论(0编辑  收藏  举报