如何使用 django-allauth 呈现两个不同主题的登录页面

问题描述 投票:0回答:1

我正在项目中成功使用 django-allauth

我想做的是拥有另一组登录/创建帐户页面,但主题不同。 然而,视图的 template_names 由 allauth 视图固定。

例如:

class LoginView(
    RedirectAuthenticatedUserMixin, AjaxCapableProcessFormViewMixin, FormView
):
    form_class = LoginForm
    template_name = "account/login." + app_settings.TEMPLATE_EXTENSION

上面,template_name是固定的。

我考虑过添加 URL 查询参数来影响模板渲染,但查询参数不会跨重定向保留,也不会在 get_context_data() 期间设置的生成的 url 保留。 因此,如果我从主题 A 的登录页面开始,并决定创建一个帐户,那么我最终会进入非 A 主题的“创建帐户页面”(因为创建帐户页面的 URL 会不包括我的查询参数)

因此,“查询参数”的想法似乎是一种非常脆弱的方法。

有什么办法可以实现这个目标吗? (顺便说一句:这是 Django 3.x,不是最新的)。

django-allauth
1个回答
0
投票

可能有更好的方法,但现在我所做的:

  1. 覆盖现有的基于类的视图,并为每个视图指定新的 template_name。
  2. 添加新模板(从现有模板复制),修改样式以适应。
  3. 在 urls.py 中添加一组专门的 url,与新的主题登录页面相匹配。

所以这并不理想(尤其是模板的重复)。 但我想不出其他方法来解决这个问题。

在新视图中也有一些情况,我必须重写 get_context_data 并或多或少地重复反向()查找,这样我就可以指向新的 URL,例如

class AppsumoPasswordResetView(PasswordResetView):
    template_name = 'account/appsumo/password_reset.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        login_url = passthrough_next_redirect_url(
            self.request, reverse("appsumo_account_login"), self.redirect_field_name
        )
        context['login_url'] = login_url
        return context

上面唯一真正的变化是在reverse()中使用appsumo_account_login

所以对所有视图都有很多类似的小修改。

所以。有用。不太好(我认为)。

© www.soinside.com 2019 - 2024. All rights reserved.