Django如何实现路径为accounts/profile/username、支持访问他人主页的用户资料视图
Django用户可公开访问个人资料功能实现方案
1. 路由配置(urls.py)
添加如下路由规则,匹配你要求的accounts/profile/用户名路径格式:
from django.urls import path from . import views urlpatterns = [ # 公开用户资料页,所有人可访问 path('accounts/profile/<slug:user_slug>/', views.UserProfileDetail.as_view(), name='profile'), # 资料编辑页,仅本人/管理员可访问 path('accounts/profile/<slug:user_slug>/edit/', views.UserProfileUpdate.as_view(), name='profile_edit'), ]
2. 视图逻辑实现(views.py)
公开用户资料视图(支持访问任意用户主页)
from django.views.generic import DetailView, UpdateView from django.core.exceptions import PermissionDenied from django.urls import reverse from .models import CustomUser, UserProfile from .forms import UserProfileForm class UserProfileDetail(DetailView): model = CustomUser template_name = 'users/profile_detail.html' # 从url中取user_slug参数匹配CustomUser的slug字段 slug_url_kwarg = 'user_slug' slug_field = 'slug' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 关联查询对应用户的资料 context['profile'] = self.object.userprofile # 判断当前访问者是否是资料主人,用于模板控制编辑按钮显示 context['is_owner'] = self.request.user == self.object return context
个人资料编辑视图(仅本人可修改)
替换你原来写的UserProfileUpdate,修正原代码中未获取slug、重复继承的问题:
class UserProfileUpdate(UpdateView): model = UserProfile template_name = 'users/profile_edit.html' form_class = UserProfileForm slug_url_kwarg = 'user_slug' # 通过关联的CustomUser的slug查询对应的UserProfile对象 slug_field = 'user__slug' # 权限校验 def dispatch(self, request, *args, **kwargs): profile = self.get_object() if profile.user != request.user and not request.user.is_staff: raise PermissionDenied return super().dispatch(request, *args, **kwargs) # 编辑成功后跳转到用户自己的资料页 def get_success_url(self): return reverse('profile', args=[self.object.user.slug])
3. 模板调用示例
生成用户资料跳转链接
任意需要跳转到用户主页的位置,直接调用你已经在CustomUser中定义的get_absolute_url方法即可:
<!-- 比如用户列表中展示用户链接 --> <a href="{{ user_obj.get_absolute_url }}">{{ user_obj.username }}</a>
资料页显示编辑按钮
在profile_detail.html中加入如下代码,只有资料主人能看到编辑入口:
{% if is_owner %} <a href="{% url 'profile_edit' user_slug=object.slug %}">编辑我的资料</a> {% endif %} <!-- 展示资料内容示例 --> <div> <img src="{{ profile.avatar.url }}" alt="用户头像"> <p>用户名:{{ object.username }}</p> <p>个人介绍:{{ profile.description }}</p> </div>
注意事项
- 你现有的模型、表单代码无需修改即可适配上述逻辑
- AutoSlugField会自动基于username生成唯一的slug,路径格式完全符合你要求的
accounts/profile/用户名样式 - 未登录用户也可以访问公开的用户资料页,如果需要限制访问可在UserProfileDetail中加入登录校验逻辑
内容的提问来源于stack exchange,提问作者demon
相关产品推荐
相关产品推荐

