Django项目URL里ID的传递(Python从入门到实践,(Python-3.8.1,Django-3.0.5))

刚学Python,按着书里的代码弄Django项目时虽然可以正常运行,但是一直搞不明白里面的某个参数是怎么传递的,书里也写的不明白,上网查都是复制粘贴书里的内容,今天runserver反复在浏览器和shell里面测试,终于搞懂了,其实还是因为不了解HTML,希望能给同样困扰的小伙伴们一点启示。

一、learning_logs\urls.py中部分代码

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

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

二、learning_logs\views.py中部分代码:

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。

三、learning_logs\templates\learning_logs\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\d+)/$’,views.topic,name=‘topic’),捕获/topics/1/中的那个topic.id并存储到变量topic_id,再传递给视图函数views.topic

views.py部分代码:


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渲染指定主题的页面

你可能感兴趣的:(python,html)