2015-07-10 2 views
1

На веб-сайте, который я создаю, есть форма входа в качестве части шаблона base.html, который распространяется на все остальные шаблоны; в результате этого мне нужно как-то обрабатывать логику входа/выхода на каждую страницу.Django-формы на базовом шаблоне

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

Edit:

Мой оригинальный метод делает действие формы всегда загрузить индекс и довольно много работал, однако я был раздражен тем, что я не мог перенаправить пользователя туда, где они были прежде, чем они вошли in

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

+0

, так что вы говорите, что вы в настоящее время выполняете логику формы в каждом представлении, а не один раз? –

+0

Да, и у меня может быть много других просмотров в будущем, это просто кажется ridicoulus – davegri

ответ

2

Вы можете поместить чек вокруг своего кода формы входа в свой шаблон.

Вы можете поместить шаблон для входа в base_login.html и расширить его на каждой странице.

пример кода базового шаблона:

{% if not user.is_authenticated %} 
    <form action="{% url my_login_url %}" method="POST"> 
     {% csrf_token %} 
     <input id="username_field" name="username" type="text" /> 
     <input id="password_field" name="password" type="password" /> 
     <button type="submit">Login</button> 
    </form> 

Этот Войти форма будет отображаться только в случае, если пользователь не прошел проверку подлинности.

Затем напишите для страницы login и LoginForm, чтобы обработать процесс входа в систему.

views.py

class LoginView(FormView): 

    ... 
    your login and redirection logic here 
    ... 

forms.py

class LoginForm(forms.Form): 

    username = .. 
    password = .. 

    ... 
    your form validations and other logic 
    ... 

Итак, будь то любая страница, форма Логин будет отображаться только если пользователь не LoggedIn и все эти Логин запросы будут отправляться только на ваш LoginView. Вам не нужно беспокоиться об обработке логики входа в каждом представлении.

+1

Чтобы расширить это, вы можете (и должны по принципу DRY) поместить этот код в файл 'base_login.html', который находится в отдельный каталог из ваших приложений и что вы используете тег [extends] (https://docs.djangoproject.com/en/1.7/topics/templates/#template-inheritance) для включения в каждый шаблон (я бы рекомендовал сделать это для любой другой повторный код). Затем в вашем 'settings.py' просто добавьте каталог в параметр' DIRS' 'TEMPLATES' [(см. Эту ссылку для информации)] (https://docs.djangoproject.com/en/1.8/topics/templates /) –

+1

Да, мы можем это сделать. Это будет подход DRYer. Добавлено его в ан. –

+0

Я думаю, что я мог бы смутить концепцию вида и URL-адреса. – davegri

1

Лучшим вариантом является создание шаблона HEADER.HTML и включение этого в ваш base.html с помощью include. Это будет лучший вариант, чем создание или отображение в форме в base.html, вы также можете сделать то же самое для нижнего колонтитула.

+0

Как это лучше, чем скелет base.html с заголовком и нижним колонтитулом? – davegri