【问题标题】:Passing Parameters to An Overrode View in Django/Allauth将参数传递给 Django/Allauth 中的覆盖视图
【发布时间】:2015-10-23 06:04:54
【问题描述】:

使用 Django 1.4 和 Allauth,我尝试创建 2 个不同的注册页面。当我说不同时,我的意思是 2 个不同的 URL 和“html 布局”。

这是我到目前为止所做的。它“有效”,但没有将“is_alternate_template”变量传递给 HTML 模板:


在 urls.py 中:

url(r'^accounts/', include('allauth.urls')),
url(r'^abc/alternate-signup/?$','project.views.alternate_signup'),

在views.py中:

def alternate_signup(request):
    from allauth.account import views as account_views
    is_alternate_template = True
    return account_views.signup(request, locals(), context_instance=RequestContext(request))

在模板/帐户/signup.html 中

{% if is_alternate_template %}
display the alternate layout of the signup page
{% else %}
display the 'standard' layout of the signup page
{% endif %}

在 Allauth 模块中,以下是帐户/视图中的注册视图(这是我从 Allauth 模块覆盖的视图,不是我自己编写的):

class SignupView(RedirectAuthenticatedUserMixin, CloseableSignupMixin, FormView):
    template_name = "account/signup.html"
    form_class = SignupForm
    redirect_field_name = "next"
    success_url = None

    def get_success_url(self):
        # Explicitly passed ?next= URL takes precedence
        ret = (get_next_redirect_url(self.request,
                                     self.redirect_field_name)
               or self.success_url)
        return ret

    def form_valid(self, form):
        user = form.save(self.request)
        return complete_signup(self.request, user,
                               app_settings.EMAIL_VERIFICATION,
                               self.get_success_url())

    def get_context_data(self, **kwargs):
        form = kwargs['form']
        form.fields["email"].initial = self.request.session.get('account_verified_email', None)
        ret = super(SignupView, self).get_context_data(**kwargs)
        login_url = passthrough_next_redirect_url(self.request,
                                                  reverse("account_login"),
                                                  self.redirect_field_name)
        redirect_field_name = self.redirect_field_name
        redirect_field_value = self.request.REQUEST.get(redirect_field_name)
        ret.update({"login_url": login_url,
                    "redirect_field_name": redirect_field_name,
                    "redirect_field_value": redirect_field_value })
        return ret

signup = SignupView.as_view()

【问题讨论】:

    标签: django django-allauth django-1.4


    【解决方案1】:

    你需要做的是在你的views.py中创建一个SignupView的子类,这真的很简单。

    class SignupViewExt(SignupView):
    
        template_name = "account/signup_alternate.html"
    

    是的,就这么简单,因为模板是您唯一需要更改的东西。然后将您的 urls.py 更改为

    url(r'^abc/alternate-signup/?$',project.views.SignupViewExt.as_view()),
    

    如果你想传递额外的参数:

    url(r'^abc/alternate-signup/?$',project.views.SignupViewExt.as_view(param='some value')),
    

    然后它将作为 self.param 提供给 SignupViewExt。

    【讨论】:

    • 谢谢,这行得通!关于如何将变量传递给该新模板的任何想法? (我需要扩展的一些基本模板使用变量来显示或不显示侧边栏)
    • 我收到 SignupViewExt.as_view 收到了无效的关键字“参数”
    • 好的,我使用这个 SO 问题做到了:stackoverflow.com/questions/11588743/… 通过添加 "def get_context_data(self, **kwargs): context = super(SignupViewExt, self).get_context_data(**kwargs) context ['my_param'] = '我的价值' 返回上下文"
    猜你喜欢
    • 2020-11-17
    • 2023-03-06
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2017-07-07
    • 2012-01-17
    相关资源
    最近更新 更多