用Django实现登录页面

最近,我开始在工作中接触django。(我是初学者)
前几天,在实现登录界面时,不小心卡住了,所以做个备忘记录一下。
没想到,一下子就发现,原来很简单呢。。。

使用Django 2.0.6版本。

这篇文章非常有参考价值。非常感谢你。

设置

“Django是一个功能强大的框架,提供了支持登录和授权的类。本次我们假设以下结构继续讨论。”

- my_app
    - my_app
        - __init__.py
        - settings.py
        - urls.py
        - wsgi.py
    - app
        - config
        - migrations
        - models
            - __init__.py
            - users.py
        - templates
            - regstration
                - login.html
            - index.html
        - tests
        - view.py
        - __init__.py
        - admin.py
        - urls.py

做过的事情 (zuò guò de shì

    テンプレートのパスと、UserModelの追加
AUTH_USER_MODEL = 'my_app.User' # 追加
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')] # 追加
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

在配置中指定一个独立的User模型作为AUTH_USER_MODEL。
另外,添加模板路径。
如果以现代化的方式编写的话,可能会使用pathlib来编写吧。

    モデルの書き換え
from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.contrib.auth.validators import UnicodeUsernameValidator
from django.core.mail import send_mail
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _

# 必要なら、user_managerを独立させてimport 

class User(AbstractBaseUser, PermissionsMixin)
    username_validator = UnicodeUsernameValidator()
    username = models.CharField(_('user name'), ....)

    # 必要なカラムを追加

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')
        db_table = 'users'

    def clean(self):
        super().clean()
        self.email = self.__class__.objects.normalize_email(self.email)

    def email_user(self, subject, message, from_email=None, **kwargs):
        """Send an email to this user."""
        send_mail(subject, message, from_email, [self.email], **kwargs)


这一部分基本上与django.contrib.auth.base_user.AbstractUser几乎相同。
关于使用哪一个更好的问题,以下链接提供了详细的信息。
– https://qiita.com/okoppe8/items/10ae61808dc3056f9c8e
– https://qiita.com/NAKKA-K/items/7627b6a22f364941b989
– http://nihaoshijie.hatenadiary.jp/entry/2014/06/11/165258

    my_app/urls.pyを編集
from django.conf.urls import url, include

urlpatterns = [
    url(r'^', include('app.urls')),
    url(r'accounts/', include('django.contrib.auth.urls')),
]

我觉得不一定需要开设accounts。

    login.htmlをコピペ

因为Django内有相关的HTML参考文档,所以我们可以先使用它
https://docs.djangoproject.com/ja/2.0/topics/auth/default/#all-authentication-views

需要做的是,把extends这部分修改为适合自己的内容。

我将目录更改为注册,但如果在编辑模型时自定义模板名称,则应该可以使用。

{% extends "base.html" %}

{% block content %}

{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}

{% if next %}
    {% if user.is_authenticated %}
    <p>Your account doesn't have access to this page. To proceed,
    please login with an account that has access.</p>
    {% else %}
    <p>Please login to see this page.</p>
    {% endif %}
{% endif %}

<form method="post" action="{% url '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>

{# Assumes you setup the password_reset view in your URLconf #}
<p><a href="{% url 'password_reset' %}">Lost password?</a></p>

{% endblock %}

如果有任何更好的建议或者认为还有不足的地方,请告诉我。

bannerAds