You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:06:01