it-swarm.com.ru

главная страница Форма входа 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
17
Liondancer

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

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

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

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, как описано в docs , он будет перенаправлен на вашу страницу входа в систему каждый раз, когда неаутентифицированный пользователь пытается получить доступ к одному из ваших представлений. Или, если вы используете представления на основе классов, используйте @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):
     ...

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

13
Peter DeGlopper

Я рекомендую 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')
6
simple_human

Вы можете использовать встроенную форму входа в 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>

3
Md. Mizanur Rahman Khan

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

Импортируйте класс представления входа в систему из встроенного приложения auth и передайте файл шаблона через 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"),
]

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

В 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 %}
2
Goran

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

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

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),

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

0
armin