Django跳转指定用户个人主页的用户名传参实现方法
Django 用户名参数传递实现方案
你需要依次修改模板、视图两处代码,现有路由配置已经符合要求无需调整:
1. 修改信息流模板的跳转链接
原有模板中{% url 'view_profile' %}没有传入路由要求的用户名参数,直接将帖子关联的发布者用户名作为参数传入url标签即可,修改对应a标签部分:
<section id="main_feed_section" class="feed_sections"> {% for post in posts %} <div class="post_main_container"> <section class="post_title"> <!-- 这里修改href,传入用户名参数 --> <h1> <a href="{% url 'view_profile' username=post.user_id.username %}">{{ post.user_id.username }}</a>{{ post.title }}</h1> </section> <section class="post_main_body"> <p>{{ post.caption }}</p> </section> <section class="post_footer"> <p>{{ post.date_posted }}</p> </section> </div> {% endfor %} </section>
用关键字参数username=post.user_id.username传参兼容性更好,不会因为路由参数顺序调整报错。
2. 修改视图函数接收参数、优化查询逻辑
原有视图没有定义形参接收url传递的用户名,还硬编码了固定账号,同时使用全表查询后在Python内存过滤的写法性能极差,修改为如下形式:
from django.shortcuts import render, get_object_or_404 # 替换成你实际的用户模型导入路径 from django.contrib.auth.models import User def view_profile(request, username): # 校验对应用户是否存在,不存在直接返回404,避免空数据报错 account = get_object_or_404(User, username=username) # 用ORM直接在数据库层过滤,不要查全表再循环判断,性能差距极大 posts = Posts.objects.filter(user_id__username=username) followers = Relationships.objects.filter(acc_followed_id__username=username) context = { "title":username, "account": account, "posts":posts, "followers":followers } return render(request, "myApp/view_profile.html", context)
路由配置说明
你现有的urls.py配置已经正确,不需要修改:
from django.urls import path from . import views urlpatterns = [ path("home/", views.home, name="home"), path("create_post/", views.create_post, name="create_post"), path('view_profile/<str:username>', views.view_profile, name="view_profile"), ]
修改完成后,点击帖子上的用户名就会跳转到/view_profile/对应用户名的路径,视图会自动拿到路径里的用户名,筛选出对应用户的数据渲染页面。
补充说明:如果你的帖子模型外键直接关联用户模型,还可以直接用外键对象查询,比如
Posts.objects.filter(user_id=account),比跨表匹配用户名效率更高。
内容的提问来源于stack exchange,提问作者logan_9997
相关产品推荐
相关产品推荐

