1

我有一个名为 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等)

4

1 回答 1

1

你自己做的太多了。您应该让 Django UpdateView[Django-doc]执行样板代码。这将调用get_template_names()方法 [Django-doc],然后该方法确实会app/modelname_form.html作为模板名称返回。所以不要覆盖post方法:

class UserProfileView(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
    model = UserProfile
    form_class = UserProfileChangeForm
    success_url = reverse_lazy('user_profile:profile')
    success_message = 'Profile updated'

    def get_object(self, *args, **kwargs):
        return self.request.user

    # no post method override
于 2019-08-06T12:09:31.890 回答