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

如何在Django类视图中将当前登录用户名传入reverse_lazy?

嘿,这问题我熟!你现在的核心问题是reverse_lazy在类定义阶段就会执行,这时候还拿不到request对象,没法直接把当前用户的用户名传进去。最稳妥也最符合Django最佳实践的方式,是重写视图的get_success_url方法,在这个方法里动态生成带用户名参数的跳转URL。

直接给你改好的代码:

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic.edit import UpdateView
from django.urls import reverse
from django.contrib import messages
from .models import Audience
from .forms import AudienceInterestsForm

@method_decorator([login_required, audience_required], name='dispatch')
class AudienceInterestsView(UpdateView):
    model = Audience
    form_class = AudienceInterestsForm
    template_name = 'interests_form.html'
    
    def get_object(self):
        return self.request.user.audience
    
    def get_success_url(self):
        # 这里可以直接获取当前登录用户的用户名,传给reverse生成目标URL
        return reverse('profiledisp', kwargs={'username': self.request.user.username})
    
    def form_valid(self, form):
        messages.success(self.request, 'Interests updated with success!')
        return super().form_valid(form)

为啥不用reverse_lazy了?

因为reverse_lazy是用来解决类定义阶段没有URL配置上下文的问题,但我们现在需要的是请求发生时的用户数据——get_success_url是在请求处理过程中调用的,这时候self.request已经完全可用,直接用普通的reverse就足够了,比reverse_lazy更直观。

另外一种可选(但不推荐)的写法

如果你非要坚持用reverse_lazy的话,可以用property结合lambda来延迟执行,但这种写法可读性差,而且在一些复杂场景下可能出问题,所以还是优先上面的方法:

# 仅作参考,不推荐使用
success_url = property(lambda self: reverse('profiledisp', kwargs={'username': self.request.user.username}))

这样改完,表单提交成功后就会跳转到带当前用户用户名参数的profiledisp页面啦~

内容的提问来源于stack exchange,提问作者THe THuG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:38:23