Проблема со страницей выхода Django, django-registration logout.html Поля формы шаблона

Я использую django-registration. После того, как это заработало, я продолжил расширять представления и формы для настройки полей с помощью Bootstrap.

У меня это работает для всего, кроме страницы выхода. В методе по умолчанию я просто создал форму с нуля, и она работала нормально. Но при попытке использовать формы Django поля вообще не отображаются. Оба шаблона входа и выхода используют эту базовую форму:

<div class="auth-form">
    <form class="form-signin" method="post" action="/accounts/login/">
        {% csrf_token %}
        <h2 class="form-signin-heading">Please log in</h2>
            <div class="font-16px top-mar-1em">
                <label for="id_username"></label>
                {{ form.username }}
                <label for="id_password1"></label>
                {{ form.password }}
                <div class="form-group">
                    <div class="col-sm-10">
                        <div class="level-checkbox">
                            <label for="checkbox">
                                {{ form.remember_me }} Remember me
                            </label>
                        </div>
                    </div>
                </div>
                <button class="btn btn-primary" type="submit">Log in</button>
        </div>
    </form>
</div>

Это отлично работает для страницы входа, но не для страницы выхода (поля отсутствуют). Как будто форма недоступна для этой страницы. Я уверен, что пропустил что-то простое, но я не могу понять это.

Мой раздел urls.py выглядит так:

url(r'^accounts/login/$','django.contrib.auth.views.login', {
    'template_name': 'registration/login.html',
    'authentication_form': UserAuthenticationForm,
}),

Я пытался добавить раздел выхода в urls.py, аналогичный разделу входа, но это не сработало. Я пробовал использовать logout_then_login, использовать login.html в качестве шаблона импорта на logout.html и другие разные вещи, но безрезультатно.

По-видимому, нет формы, связанной с представлением выхода по умолчанию, так что это, вероятно, проблема, но я не уверен, что это лучший способ реализовать стандартную форму в представлении выхода.


person nicorellius    schedule 26.12.2013    source источник
comment
Какое представление вы используете для создания страницы выхода?   -  person Scott Woodall    schedule 26.12.2013
comment
Пока что вид по умолчанию... Я расширил AuthenticationView для входа в систему, но когда я передаю тот же вид urls.py, он выдает ошибку. Это похоже на то, что я мог что-то упустить, но я не уверен, как это реализовать.   -  person nicorellius    schedule 26.12.2013
comment
Представление выхода Django по умолчанию не имеет связанных с ним форм. Я прав в том, что вы хотите вывести пользователя из системы, а затем снова перенаправить его на форму входа?   -  person Scott Woodall    schedule 26.12.2013
comment
Да, это правильно, но для другого шаблона, logout.html, чтобы я мог отобразить сообщение пользователю. Я не знал, что представление по умолчанию не имеет связанных с ним форм. Тогда скорее всего это моя проблема. Как лучше поступить? Я попытался передать расширенную форму, которую я создал для просмотра/страницы журнала, в urls.py в качестве аргумента, и это выдало ошибку...   -  person nicorellius    schedule 26.12.2013


Ответы (2)


Вы должны иметь возможность добавить следующее в свой urls.py и все заработает.

url(r'^accounts/logout/$','django.contrib.auth.views.logout_then_login')

Убедитесь, что вы указали LOGIN_URL свой settings.py. Затем, когда пользователь щелкнет ссылку выхода, он попадет в представление выхода, которое позаботится о перенаправлении в представление входа, содержащее вашу форму.

person Scott Woodall    schedule 26.12.2013
comment
Спасибо за ответ. Уже пробовал это и не совсем то, что мне нужно (упоминается в моем ОП)... Я хочу, чтобы пользователи попадали на страницу logout.html, содержащую ту же форму, что и в файле login.html. Он содержит некоторые html, которые отображают сообщение, например, вы вышли из системы. Я мог бы использовать представление logout_then_login, если бы сообщение отображалось на странице login.html. - person nicorellius; 26.12.2013
comment
Что это за сообщение? Вы вышли из системы? потому что вы можете использовать для этого структуру сообщений. - person tsurantino; 26.12.2013
comment
Я все еще новичок в Django, поэтому я не знаю всех крутых трюков для такого рода вещей. Я уверен, что я целеустремленный, пытаясь навязать идею просмотра/формы выхода из системы. Возможно, лучше использовать logout_then_login с фреймворком сообщений. Спасибо. - person nicorellius; 26.12.2013

Благодаря @tsurantino я смог заставить это работать, используя структуру сообщений. Мне всегда нравится, когда мне нужно реализовать новую функцию, используя часть Django, которую я раньше не использовал. Дополнение к инструментарию, так сказать. Вот что я сделал:

Поскольку у меня уже был файл signal_connectors.py для отправки электронной почты на основе регистрации/активации пользователя, я просто добавил к нему:

@receiver(user_logged_out)
def user_logged_out_message(sender, request, **kwargs):
    messages.add_message(
        request,
        messages.INFO,
        'You\'ve been successfully logged out. You can log in again below.'
)

Затем в моем common приложении __init__.py я импортировал его:

from common.signal_connectors import user_logged_out_message

Затем в моем шаблоне login.html:

{% if messages %}
    <div class="alert-success align-ctr font-16px top-mar-2em">
        {% for message in messages %}
            {{ message }}
        {% endfor %}
    </div>
{% endif %}

Наконец, чтобы перенаправить на страницу входа после выхода из системы (urls.py):

url(r'^accounts/logout/$','django.contrib.auth.views.logout_then_login'),

Спасибо всем за помощь и комментарии.

person nicorellius    schedule 26.12.2013