我有一个名为 UserProfile 的扩展用户模型,更新视图使用 SuccessMessageMixin 重定向成功更新。问题是 django 代码中的某些内容试图将未设置的 var(路径)加入路径,我不知道为什么。
user_profile/views.py
class UserProfileView(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
model = UserProfile
form_class = UserProfileChangeForm
success_url = reverse_lazy("user_profile:profile")
# success_url = "/success/"
success_message = "Profile updated"
def get_object(self, *args, **kwargs):
return self.request.user
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST, instance=request.user)
if form.is_valid():
profile = form.save(commit=False)
profile.save()
return render(request, self.template_name, {"form": form})
提交带有更改数据的表单时的堆栈跟踪(数据确实得到了更新,所以这纯粹是一个重新显示问题)。
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\ntpath.py" in join
89. for p in map(os.fspath, paths):
During handling of the above exception (expected str, bytes or os.PathLike object, not NoneType), another exception occurred:
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\site-packages\django\core\handlers\exception.py" in inner
34. response = get_response(request)
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\site-packages\django\core\handlers\base.py" in _get_response
115. response = self.process_exception_by_middleware(e, request)
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\site-packages\django\core\handlers\base.py" in _get_response
113. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\site-packages\django\views\generic\base.py" in view
71. return self.dispatch(request, *args, **kwargs)
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\site-packages\django\contrib\auth\mixins.py" in dispatch
52. return super().dispatch(request, *args, **kwargs)
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\site-packages\django\views\generic\base.py" in dispatch
97. return handler(request, *args, **kwargs)
File "D:\users\mjnic\OneDrive\Workspaces\Django\pyp\src\pyp\user_profile\views.py" in post
30. return render(request, self.template_name, {"form": form})
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\site-packages\django\shortcuts.py" in render
36. content = loader.render_to_string(template_name, context, request, using=using)
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\site-packages\django\template\loader.py" in render_to_string
61. template = get_template(template_name, using=using)
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\site-packages\django\template\loader.py" in get_template
15. return engine.get_template(template_name)
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\site-packages\django\template\backends\django.py" in get_template
34. return Template(self.engine.get_template(template_name), self)
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\site-packages\django\template\engine.py" in get_template
143. template, origin = self.find_template(template_name)
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\site-packages\django\template\engine.py" in find_template
125. template = loader.get_template(name, skip=skip)
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\site-packages\django\template\loaders\base.py" in get_template
18. for origin in self.get_template_sources(template_name):
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\site-packages\django\template\loaders\filesystem.py" in get_template_sources
36. name = safe_join(template_dir, template_name)
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\site-packages\django\utils\_os.py" in safe_join
32. final_path = abspath(join(base, *paths))
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\ntpath.py" in join
115. genericpath._check_arg_types('join', path, *paths)
File "C:\Users\mjnic\.virtualenvs\pyp-E_0Se9Bl\lib\genericpath.py" in _check_arg_types
149. (funcname, s.__class__.__name__)) from None
Exception Type: TypeError at /profile/
Exception Value: join() argument must be str or bytes, not 'NoneType'
我错过了什么?根据文档,设置success_url就足够了,并且只需要“/profile/”链接,因为没有人可以维护另一个用户配置文件(即url中不需要pk、slug等)