如何在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
相关产品推荐
相关产品推荐

