Главная страница Форма входа Django

Я хочу создать домашнюю страницу с заголовком, который просит войти в систему с именем пользователя / паролем и кнопкой входа в систему. В настоящее время моя страница настроена так, что нажатие кнопки "Войти" отправит меня на страницу входа. Я хочу просто ввести информацию и нажать "Войти" для входа на домашнюю страницу моего сайта. Как я могу создать свой urls.py а также views.py выполнить вход на главной странице?

у меня есть base.html это шаблон для моей главной страницы. В шаблоне я сделал login.html частичный вид:

<form action='/accounts/auth/' method='POST'> {% csrf_token %}
    <div >
        <label for='username'> Username </label>
        <input type='text' name='Username' id='username'>
        <label for='password'>Password </label>
        <input type='password' name='Password' id='password'>
        <input type='submit' value='login'>
    </div>
</form>

Я немного смущен для action атрибут, поскольку я не уверен, куда отправлять данные формы, если я хочу авторизовать вход на той же странице.

Мои views.py

def login(request):
    c = {}
    c.update(csrf(request))
    return render(request, 'login.html', c)


def auth_view(request):
    username = request.POST.get('username', '')
    password = request.POST.get('password', '')
    user = auth.authenticate(username = username, password = password)      

    if user is not None:
        auth.login(request, user)
        return HttpResponseRedirect('/accounts/loggedin')
    else:
        return HttpResponseRedirect('/accounts/invalid')

Я не уверен где HttpResponseRedirect а также, если вход в систему все сделано на домашней странице.

Возможно, я могу сделать render(request,SomePartialView.html) вместо HttpResponseRedirect,

Вот мой urls.py:

url(r'^$', 'photoblog.views.login'),   #displays login.html
url(r'^accounts/auth/$', 'photoblog.views.auth_view'),    #authorize login

5 ответов

Если вы просто хотите иметь домашнюю страницу со статическим контентом, который обрабатывает входы в систему, встроенное приложение аутентификации Django может справиться с этим без особых усилий. Вам просто нужно привязать URL к django.contrib.auth.views.login и, вероятно, один, чтобы django.contrib.auth.views.logout, напишите шаблон входа в систему и шаблон пост-выхода из системы, затем установите пару переменных настройки.

Полная настройка описана здесь: https://docs.djangoproject.com/en/dev/topics/auth/default/

Вот соответствующие биты из моего рабочего проекта:

urls.py:
# HomeView is a simple TemplateView that displays post-login options
urlpatterns = patterns('',
    ...
    url(r'^myapp/$', HomeView.as_view(template_name='home.html'), name='home'),
    url(r'^accounts/login/$', 'django.contrib.auth.views.login', name='login'),
    url(r'^accounts/logout/$', 'django.contrib.auth.views.logout', name='logout'),
    ...
)

settings.py:
from django.core.urlresolvers import reverse_lazy
...
LOGIN_URL = reverse_lazy('login')
LOGIN_REDIRECT_URL = reverse_lazy('home')

templates/registration:
login.html:
{% extends "base.html" %}
{% block head %}
<title>Login</title>
{% endblock %}
{% block body %}
{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}
<form method="post" action="{% url 'django.contrib.auth.views.login' %}">
{% csrf_token %}
<table>
<tr>
    <td>{{ form.username.label_tag }}</td>
    <td>{{ form.username }}</td>
</tr>
<tr>
    <td>{{ form.password.label_tag }}</td>
    <td>{{ form.password }}</td>
</tr>
</table>
<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
{% endblock %}

logged_out.html:
{% extends "base.html" %}
{% block head %}
<title>Logged out</title>
{% endblock %}
{% block body %}
<p>You have been logged out.  You may <a href="{% url 'login' %}">log back in</a>.</p>
{% endblock %}

Я не показываю base.html шаблон, но я верю, что шаблон очевиден. Если вы хотите больше, чем просто форму входа, нет причин login.html шаблон не может быть моднее. Имена являются значениями по умолчанию, как документировано для представлений, но вы можете использовать другие варианты, если хотите.

Это все, что вам нужно для базового поведения. Если вы оберните свои взгляды с login_required Декоратор, как описано в документации, будет перенаправлять на вашу страницу входа в систему каждый раз, когда неаутентифицированный пользователь пытается получить доступ к одному из ваших просмотров. Или, если вы используете представления на основе классов, используйте @method_decorator(login_required) как задокументировано здесь. Еще два фрагмента из моего проекта:

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator

class HomeView(TemplateView):
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(HomeView, self).dispatch(*args, **kwargs)

@login_required
def report_for_group(request, group_id):
     ...

Документы включают в себя обсуждения некоторых более сложных настроек, если они вам понадобятся.

Вы можете использовать встроенную форму входа в Django. Это легко и эффективно. И это даст вам некоторые функции, такие как проверка формы.

в urls.py:

url(r'^login/$',views.loginView,name='login'),  

в views.py:

from django.contrib.auth.views import login
from django.contrib.auth.forms import AuthenticationForm


def loginView(request):
    if request.method == 'POST':
        form = AuthenticationForm(data=request.POST)
        if form.is_valid():
            user = form.get_user()
            login(request, user)
            return redirect('/website/profile/')
    else:
        form = AuthenticationForm()
    return render(request, 'website/login.html', {'form': form})

на HTML-странице:

<form method="post">
{% csrf_token %}
{{form.as_p}}
<p><input type="submit" value="Log in"></input></p>

Рекомендую django-registration это довольно легко. в нем также есть подтверждение по электронной почте.

тебе нужно дополнение url скажи домой:

url(r'^home/$', 'photoblog.views.home',name='home'),
.............

его views, home доступ был ограничен только зарегистрированными пользователями

from django.contrib.auth.decorators import login_required
@login_required(login_url='/') #if not logged in redirect to /
def home(request):        
    return render(request, 'home.html')

тебе не нужно csrf в login.py

то есть:

def login(request):
    return render(request, 'login.html')

достаточно, как render пройдет токен csrf

from django.core.urlresolvers import reverse
def auth_view(request):
    username = request.POST.get('username', '')
    password = request.POST.get('password', '')
    user = auth.authenticate(username = username, password = password)      

    if user is not None:
        auth.login(request, user)
        return HttpResponseRedirect(reverse('home'))
    else:
        return HttpResponseRedirect('/accounts/invalid')

Использование Django 1.11. У меня была такая же проблема только сейчас, вот что сработало для меня...

Импортируйте класс представления входа в систему из встроенного приложения авторизации и передайте файл шаблона через template_name kwarg.

В urls.py:

from django.contrib.auth.views import LoginView

app_name = 'yourapp'
urlpatterns = [
    url(r'^$', LoginView.as_view(template_name='yourapp/index.html'), name="index"),
]

И, по вашему мнению, вы можете использовать переменную формы для визуализации вашей формы. В моем случае я использую bootstrap так.

В index.html:

{% extends 'base.html' %}
{% loads bootstrap %}
{% block content %}
    <form method="post" action="{% url 'login' %}">
        {% csrf_token %}
        {% bootstrap_form form %}
        {% bootstrap_button "Login" button_type="submit" button_class="btn-primary" %}
        {# Assumes you setup the password_reset view in your URLconf #}
        <p><a href="{% url 'password_reset' %}">Lost password?</a></p>
    </form>
{% endblock content %}

Я нашел решение.

во-первых, настройте вход в систему и выход из системы:

views.py

def login_user(request):
logout(request)
username = password = ''
form1 = RegistrationForm()
if request.POST:
    username = request.POST['username']
    password = request.POST['password']

    user = authenticate(username=username, password=password)
    if user is not None:
        login(request, user)
        return redirect("redirect any whre u want")

return render(request, 'Write login templaye address')

def logout_user(request):
    user = request.user
    logout(request, user)
    return redirect("redirect any whre u want")

Тогда в вашем base.html вы должны сделать так:

base.html

<form method="post" action="/user/login/" novalidate>
            {% csrf_token %}


                    <input class="form-control" id="id_username" name="username" placeholder=""
                           required="" type="text"
                           style="">
                </div>
                <div class="form-group">

      <span class="material-icons" style=""
      >lock</span>
                    <input class="form-control" id="password1" name="password" style="" autofocus=""
                           placeholder=""
                           required=""
                           type="password">
                </div>

                <button class="btn btn-primary" type="submit" style=""></button>
            </div>


        </form>

И login.html

<form method="post" action="/user/login/">
    {% csrf_token %}
    <div class="form-group">
    <p>
            <label for="id_username">username</label>
            <input class="form-control" id="id_username" name="username" autofocus="" required="" type="text">
        </p>
    <p>
            <label for="id_password">password</label>
            <input class="form-control" id="id_password" name="password" autofocus="" required="" type="password">
        </p>
    <button type="submit">login</button>
    </div>
</form>

urls.py

 url(r'^login/$', views.login_user, name='login'),
 url(r'^logout/$', views.logout_user),

На самом деле вы берете входные данные на домашней странице и даете их на страницу входа, что хорошо для обработки ошибок ввода.

Другие вопросы по тегам