【问题标题】:Django UpdateView returns a blank rendered templateDjango UpdateView 返回一个空白的渲染模板
【发布时间】:2021-05-29 10:10:21
【问题描述】:

我正在使用 django allauth 进行用户身份验证,在我的适配器中我修改了 get_login_redirect_url 以重定向 新用户到ONBOARD_URL,这样他们就可以完成注册过程,而普通用户则获得预期的LOGIN_REDIRECT_URL

class UserAccountAdapter(DefaultAccountAdapter):
    def get_login_redirect_url(self, request):
        if request.user.is_authenticated and (not request.user.name or not request.user.avatar
                                              or not request.user.mobile):
            url = settings.ONBOARD_URL
        else:
            url = settings.LOGIN_REDIRECT_URL
        return resolve_url(url)

我有两个处理视图的函数,它们都分别继承自 UpdateView 和 DetailView。

class UpdateUserAfterSignupView(LoginRequiredMixin, UpdateView):
    model = User
    form_class = UpdateUserAfterSignupForm
    template_name = 'users/user_form.html'
    context_object_name = 'user'
    success_url = reverse_lazy('users:detail')
class UserDetailView(LoginRequiredMixin, DetailView):
    model = User
    slug_field = 'username'
    slug_url_kwarg = 'username'
    template_name = 'users/user_detail.html'
    context_object_name = 'user'

    def get_object(self, queryset=None):
        return get_object_or_404(self.model, username=self.request.user.username)

在我的DetailView 中,如果我省略了get_object,它会返回一个PageNotFound 404,但是当它按原样出现时,我会得到一个空白页 在渲染的模板中。这是模板:

{% extends 'base.html' %}
{% block content %}
<p>welcome {{user}}</p>
<form action="" method="post" enctype="multipart/form-data">{% csrf_token %}
    {{ form.as_p }}
    <button type="submit" value="submit">submit</button>
</form>
{% endblock %}

我的 url conf 看起来像这样

[
    path('<str:username>/', views.UserDetailView.as_view(), name='detail'),
    path('complete-signup/', views.UpdateUserAfterSignupView.as_view(), name='complete_signup'),
]

同样,所有这些都会导致一个空白的渲染模板,什么都没有。你能建议我应该做的事情吗 不同,或添加。我可以根据需要提供更多信息。谢谢

编辑

DetailView 模板如下所示:

{% extends 'base.html' %}
{% block content %}
<p>{{user.name}}</p>
{% if user.avatar %}
<p><img src="{{ user.avatar.url }}" alt=""></p>
{% endif %}
<p>{{ user.mobile }}</p>
{% endblock %}

我的基本模板如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {% block content %}
    {% endblock %}
</body>
</html>

编辑 2 我的模板目录设置如下所示:

'DIRS': [
            os.path.join(BASE_DIR / 'templates'),
            os.path.join(BASE_DIR / 'auth_templates'),
        ],

【问题讨论】:

  • A DetailView 没有 form,因此渲染 {{ form }} 没有多大意义。
  • 我不完全确定我理解你的意思,但是渲染表单的模板是由更新视图而不是详细视图处理的。请详细说明一下好吗?
  • 能否请您编辑您的问题并发布两个模板的完整模板代码以及任何基本模板。
  • @evergreen 我刚刚做了。谢谢
  • 您的{% extend ... %} 和user_detail 和user_form 模板的顶部是否有行?如果是这样,请您添加这些。

标签: django django-allauth


【解决方案1】:

终于搞定了,这些是我的改动:

适配器

class UserAccountAdapter(DefaultAccountAdapter):
    def get_login_redirect_url(self, request):
        if request.user.is_authenticated and (not request.user.name and not request.user.avatar and
                                              not request.user.mobile):
            return reverse('users:complete_signup', kwargs={'username': request.user.username})

        else:
            return resolve_url(settings.LOGIN_REDIRECT_URL)

详细视图

class UserDetailView(LoginRequiredMixin, DetailView):
    model = User
    slug_field = 'username'
    slug_url_kwarg = 'username'
    template_name = 'users/user_detail.html'
    context_object_name = 'user'

    def get_object(self, queryset=None):
        return get_object_or_404(self.model, username=self.request.user.username)

更新视图

class UpdateUserAfterSignupView(LoginRequiredMixin, UpdateView):
    model = User
    slug_field = 'username'
    slug_url_kwarg = 'username'
    form_class = UpdateUserAfterSignupForm
    template_name = 'users/user_update.html'
    context_object_name = 'user'

网址

urlpatterns = [
    path('<str:username>/', views.UserDetailView.as_view(), name='detail'),
    path('<str:username>/complete-signup/', views.UpdateUserAfterSignupView.as_view(), name='complete_signup'),
]

我的detail URL 匹配任何内容,包括complete_signup URL。这些更改帮助解决了这个问题,模板现在显示预期的表单,而不是之前的空白页面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-02
    • 2018-12-28
    • 2015-09-18
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多