如何使用 djangocms 在每个页面中使用 django-userena 登录和注销表单?

Posted

技术标签:

【中文标题】如何使用 djangocms 在每个页面中使用 django-userena 登录和注销表单?【英文标题】:How can I use django-userena login and logout forms in every page with djangocms? 【发布时间】:2016-10-19 20:51:02 【问题描述】:

我有一个使用 djangocms 运行的站点,我需要 django-userena 的登录和注销功能,这对我来说很容易使用,因为每个用户也会有一个个人资料页面。每个页面中的菜单设计都表明一个简单的登录表单必须位于菜单的右上角。我已经这样做了,但我需要 django-userena 登录才能使用它。我该怎么做?

我尝试在我的 base.html 中添加表单。还尝试使用这样的 middleware.py

    class LoginFormMiddleware(object):
        def process_request(self, request):
        from userena.forms import AuthenticationForm
        if request.method == 'POST' and request.POST.has_key('base-account') and request.POST['base-account'] == 'Login':
        form = AuthenticationForm(data=request.POST, prefix="login")
        if form.is_valid():
            from django.contrib.auth import login
            login(request, form.get_user())
        request.method = 'GET'
    else:
        form = AuthenticationForm(request, prefix="login")
    request.login_form = form

class LogoutFormMiddleware(object):
def process_request(self, request):
    if request.method == 'POST' and request.POST.has_key('base-account') and request.POST['base-account'] == 'Logout':
        from userena.views import signout
        signout(request)
        request.method = 'GET'

base.html

<form class="navbar-form navbar-right login-strip" action="" method="post">
                        % csrf_token %
                        <p id="login">
                             request.login_form.non_field_errors 
                            % for field in request.login_form %
                                 field.errors 
                                 field.label_tag:  field 
                            % endfor %
                            <input type="submit" name="base-account" value="Login" />
                        </p>
                    </form>
                    % else %
                    <form class="navbar-form navbar-right login-strip" action="" method="post">
                        % csrf_token %
                        <p id="logout">Logged in as <b> request.user.username </b>.
                            <input type="submit" name="base-account" value="Logout" />
                        </p>
                    </form>
                    % endif %

这给了我这个错误 'WSGIRequest' 对象没有属性 'get'

【问题讨论】:

【参考方案1】:

我在这方面尝试了很多大腿。 现在我没有使用任何侧面的 django-authetication 我只是在我的 menu.html 中放了一些代码,这样我就可以根据需要登录和注销。 我的问题是普通帐户无法注销。

我的解决方法是:

menu.html

% load i18n menu_tags cache %

% for child in children %
	<li class="% if child.ancestor %ancestor% endif %
		% if child.selected % active% endif %
		% if child.children % dropdown% endif %">
		% if child.children %
			<a class="dropdown-toggle" data-toggle="dropdown" href="#">
				 child.get_menu_title  <span class="caret"></span>
			</a>
			<ul class="dropdown-menu">
				% show_menu from_level to_level extra_inactive extra_active template "" "" child %
			</ul>
		% else %
			<a href=" child.get_absolute_url "><span> child.get_menu_title </span></a>
		% endif %
		</li>
		% if class and forloop.last and not forloop.parentloop %% endif %
% endfor %
		<li class="User" style="position: absolute; right: 0;">
			<a >
				% if user.is_authenticated %
                    <form method="post" action= "accounts/logout/?next= request.path ">
						% csrf_token %
						<button type="submit" class="cms-btn cms-btn-action"><span class="glyphicon glyphicon-user"></span>  request.user.username </button>
					</form>
				% else %
                    <form action="% url 'pages-root' %% if request.path != logout_url %?next= request.path &amp; cms_edit_on &amp;cms-toolbar-login=1% endif %"
                        class="cms-toolbar-item cms-form-login" method="post">
                        % csrf_token %
                        <label% if request.toolbar.login_form.username.errors or request.toolbar.login_form.non_field_errors or cms_toolbar_login_error % class="cms-error"% endif %>
                            <span>% trans request.toolbar.login_form.username.label %</span>
                             request.toolbar.login_form.username 
                        </label>
                        <label% if request.toolbar.login_form.password.errors or request.toolbar.login_form.non_field_errors or cms_toolbar_login_error % class="cms-error"% endif %>
                            <span>% trans request.toolbar.login_form.password.label %</span>
                             request.toolbar.login_form.password 
                        </label>
                        <label>
                            <input class="cms-btn cms-btn-action" type="submit" value="% trans 'Login' %">
                        </label>
                    </form>
				% endif %
			</a>
		</li>

urls.py 添加了这个:

url(r'^accounts/', include('django.contrib.auth.urls')),

【讨论】:

【参考方案2】:

我最终得到了这个代码,更多的移动朋友。

<li class="User" style="position: absolute; right: 0;">
        <a >
            % if user.is_authenticated %
                <form method="post" action= "accounts/logout/?next= request.path ">
                    % csrf_token %
                    <p id="logout"><span class="glyphicon glyphicon-user"></span> <b> request.user.username </b>
                    <button type="submit" class="cms-btn cms-btn-action"><span class="glyphicon glyphicon-off"></span> % trans "Logout" %</button>
                </form>
            % else %
                <form method="post" action="request.path?edit">
                    % csrf_token %
                    <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-user"></span> % trans "Login" %</button>
                </form>
            % endif %
        </a>
    </li>

【讨论】:

以上是关于如何使用 djangocms 在每个页面中使用 django-userena 登录和注销表单?的主要内容,如果未能解决你的问题,请参考以下文章

使用 djangocms 发布页面更改时出现“NodeAlreadySaved”错误

如何使 djangocms-admin 风格的标志动态化?

检查 Django CMS 中是不是存在页面

重定向到 DjangoCMS 中的自定义 404 html 页面

djangocms 3.2 页面级别

Django CMS - 在模板标签中调用 cmsplugin