Настройка библиотеки django-allauth, часть 2

    |   30.05.2019 |   08:31:36 |   Django |

В этой части я расскажу и покажу, как делал страницу регистрации с применением библиотеки django-allauth. В первой части я писал о настройки страницы авторизации, если вы еще не посмотрели, то можете это сделать прямо сейчас перейдя по этой ссылке.

В принципе здесь все тоже самое, что и при авторизации. Сначала нужно перенести html код формы регистрации библиотеки в свою форму. Затем в forms.py я добавил несколько полей, это имя и фамлия пользователя и сделал их по умолчанию  не обязательными полями. И в settings.py в словарь добавил свой класс формы.

 

Внедряем этот код в свой шаблон регистрации

{% extends "account/base.html" %}

{% load i18n %}

{% block head_title %}{% trans "Signup" %}{% endblock %}

{% block content %}
<h1>{% trans "Sign Up" %}</h1>

<p>{% blocktrans %}Already have an account? Then please <a href="{{ login_url }}">sign in</a>.{% endblocktrans %}</p>

<form class="signup" id="signup_form" method="post" action="{% url 'account_signup' %}">
  {% csrf_token %}
  {{ form.as_p }}
  {% if redirect_field_value %}
  <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
  {% endif %}
  <button type="submit">{% trans "Sign Up" %} &raquo;</button>
</form>

{% endblock %}

Далее в forms.py я создал класс SignUp с двуми доп.полями + капча и насдуемся как вы заметили уже от класса SignupForm

class SignUp(SignupForm):
    '''Добавление своих полей в форму регистрации'''
    captcha = CaptchaField(label='Are you an human? ', )
    first_name = forms.CharField(max_length=30, label='First Name', required=False)
    last_name = forms.CharField(max_length=30, label='Last Name', required=False)

    def signup(self, request, user):
        '''Сохранение в базу данных'''
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.save()
        return user

Тут нужно обязательно написать метод, который будет сохранять в базу данных значения полей которые пользователь заполнит. Если сохранять не нужно в бд данные, то этот метод не нужен.

Переходим в settings.py и в словарь ACCOUNT_FORMS добавляем путь до нашего класса

ACCOUNT_FORMS = {

    'login': 'profiles.forms.SignIn',
    'signup': 'profiles.forms.SignUp',

}

Теперь перейдем в наш шаблон формы регистрации. У меня он выглядит так

Весь код его я приводить не буду, акцентиррую внимание только на основном.

Здесь вывод полей я делал по тому же принципу что и в авторизации. Открывал в браузере консоль, наводил курсор на нужное поле и смотрел его name и id. Ошибки выводил не много по другому для каждогополя выводил отдельно.


Пример части моего кода шаблона регистрации.



<form id="loginform" class="form-horizontal" role="form" method="post" action="{% url 'account_signup' %}" >
   {% csrf_token %}
   <div class="row">
      <div class="col-xs-12 col-sm-12 col-md-12">
         <p>Логин <sup>*</sup></p>
         <!-- Вывод ошибок о неверно заполненом поле -->
         {{ form.non_field_errors }}
         <div class="fieldWrapper">
            {% if form.username.errors %}
            <div class="alert alert-warning">{{ form.username.errors }}</div>
            {% endif %}
            <div style="margin-bottom: 25px" class="input-group">
               <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
               <input value="{{ form.username.value|default:'' }}" type="text" name="username" id="id_username" class="form-control input-lg" placeholder="Login*" tabindex="1" required>
            </div>
         </div>
      </div>
   </div>
   <div class="row">
      <div class="col-xs-12 col-sm-6 col-md-6">
         <p>Имя <sup></sup></p>
         <div style="margin-bottom: 25px" class="input-group">
            <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
            <input type="text" name="first_name" id="id_firstname" class="form-control input-lg" placeholder="First Name" tabindex="1">
         </div>
      </div>
      <div class="col-xs-12 col-sm-6 col-md-6">
         <p>Фамилия <sup></sup></p>
         <div style="margin-bottom: 25px" class="input-group">
            <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
            <input type="text" name="last_name" id="id_lastname" class="form-control input-lg" placeholder="Last Name" tabindex="2">
         </div>
      </div>
   </div>
   <p>e-mail <sup>*</sup></p>
   <!-- Вывод ошибок о неверно заполненом поле -->
   <div class="fieldWrapper">
      {% if form.email.errors %}
      <div class="alert alert-warning">{{ form.email.errors }}</div>
      {% endif %}
      <div style="margin-bottom: 25px" class="input-group">
         <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>
         <input value="{{ form.email.value|default:'' }}" id="id_email" type="email" class="form-control" name="email" value="" placeholder="e-mail*" required>
      </div>
   </div>
</form>

Результат если пользователь ввел данные в поля с ошибками будет такой.

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

Еще в settings.py из документации библиотеки я добавил некоторые настройки

# django-allauth
ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 5 # Определяет срок действия писем с подтверждением по электронной почте
ACCOUNT_AUTHENTICATION_METHOD = 'username_email' # Вход на сайт по логину и почте
ACCOUNT_EMAIL_VERIFICATION = 'mandatory' # Когда установлено «mandatory», пользователь блокируется от входа, пока адрес электронной почты не будет подтвержден.
ACCOUNT_LOGIN_ATTEMPTS_LIMIT = 2 # Количество попыток не удачного ввода логина и пароля. После пользователь блокируется.
ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT = 300 # Время блокировки пользователя в секундах после количества не удачного ввода логина и пароля. 
ACCOUNT_EMAIL_REQUIRED = True
LOGIN_REDIRECT_URL = '/accounts/profile/' # редирект после успешной авторизации
LOGIN_URL = '/accounts/login/'

На этом все.

Ваши комментарии

Комментарии могут оставлять только зарегистрированые пользователи!

Disqus - комментарии

blog comments powered by Disqus