破棄されたブログ

このブログは破棄されました。

Django でログインフォームを雑に作るぞ!!

f:id:namidamexx:20150907233752p:plain

Django では、 django.contrib.auth パッケージでユーザ認証機能を利用できる。 また、このパッケージはログイン用のビューも予め用意してくれている。 ログインロジックを独自に実装する必要がない場合は、このビューを使うと楽っぽい。

django.contrib.auth は、デフォルトでインストール済みのはずなので、 まずは、ログイン機能を実装したい app のルーティングを設定する。

# yourapp/urls.py
from django.conf.urls import url
from django.contrib.auth import views as auth_views


urlpatterns = [
    # ...
    url(r'^login/', auth_views.login, { 'template_name': 'yourapp/login.html' }),
]

次にログインのテンプレートを作成する。 テンプレートへは、AuthenticationForm オブジェクトがコンテキスト変数 form として注入される。

したがって、テンプレートは以下のようになる。

{# yourapp/login.html #}
{% extends "yourapp/base.html" %}

{% block content %}

<!-- ログイン失敗時には、ここでエラーメッセージを表示する -->
{% if form.errors %}
<p>なんかおかしいです</p>
{% endif %}

<form method="post" action="{% url 'django.contrib.auth.views.login' %}">
    {% csrf_token %}
    <h2>Sign in</h2>

    <hr />

    <div>
        <label for="{{ form.username.id_for_label }}">{{ form.username.label }}</label>
        {{ form.username }}
    </div>
    <div>
        <label for="{{ form.password.id_for_label }}" class="sr-only">{{ form.password.label }}</label>
        {{ form.username }}
    </div>

    <button type="submit" value="Sign in" />
</form>


{% endblock %}

これで、 http://example.com/path/to/yourapp/login にアクセスするとログインフォームが使える。

また、同様にログアウトなどのビューも予め django.contrib.auth で用意されている。

Bootstrap との統合

Bootstrap を利用している場合、 input 要素などに class 属性を割り振る必要がある。 以下では、サードパーティのライブラリ django-widget-tweaks を用いて対応する。

{# yourapp/login.html #}
{% extends "yourapp/base.html" %}
{% load widget_tweaks %}

{% block content %}

<!-- ログイン失敗時には、ここでエラーメッセージを表示する -->
{% if form.errors %}
<p>なんかおかしいです</p>
{% endif %}

<form class="form-signin" method="post" action="{% url 'django.contrib.auth.views.login' %}">
    {% csrf_token %}
    <h2>Sign in</h2>

    <hr />

    <div class="form-group">
        <label for="{{ form.username.id_for_label }}" class="sr-only">{{ form.username.label }}</label>
        {% render_field form.username class="form-control" placeholder=form.username.label %}
    </div>
    <div class="form-group">
        <label for="{{ form.password.id_for_label }}" class="sr-only">{{ form.password.label }}</label>
        {% render_field form.password class="form-control" placeholder=form.password.label %}
    </div>

    <button type="submit" value="Sign in" />
</form>
{% endblock %}

これでイナフ

備考

  • Authentication view は、 Django 1.5 のドキュメントによると、 Django 1.4 からの利用できるらしい。
  • form 以外のコンテキスト変数については、ドキュメントを参照のこと。
  • django.contrib.auth.views.login は、 authentication_form を引数に取る。 したがって、 AuthenticationForm をオーバーライドすれば、 django-widget-tweaks を用いる必要は無いのかもしれない。
広告を非表示にする