もた日記

くだらないことを真面目にやる

Djangoメモ(19) : ユーザー認証を実装する〜サインアップ(ユーザー登録)

  • ユーザー認証
  • accountsアプリ作成
  • サインアップページ作成
  • フォーム作成
  • ビューの処理
  • データベースの確認
  • まとめ

Python 3.6.4 Django 2.0.2

A Complete Beginner's Guide to Djangoのチュートリアルを参考にユーザー認証を実装してみる。


ユーザー認証

Djangoの認証システムを使用して下記機能が使えるユーザー認証を実装していく。
なお、チュートリアルはDjango 1.11で書かれているためDjango2.0ではもっと良い実装方法があるかもしれないが、まずはチュートリアル通りに実装してみる。

  • サインアップ(ユーザー登録)
  • ログイン
  • ログアウト
  • パスワードリセット
  • パスワード変更
続きを読む

Djangoメモ(18) : django-widget-tweaksを使用してBootstrapのフォームを作成する

  • django-widget-tweaksのインストール
  • テンプレートの編集
  • 再利用可能なテンプレート
  • フォームのテストを追加
  • (参考)django-widget-tweaksで発生したエラー
  • まとめ

Python 3.6.4 Django 2.0.2

A Complete Beginner's Guide to Djangoのチュートリアルを参考にdjango-widget-tweaksを使用してBootstrapのフォームを作成してみる。


django-widget-tweaksのインストール

チュートリアルではdjango-widget-tweaksを使用しているが、Django 2.0ではエラーが発生(後述)したのでdjango-widget-tweaksをフォークしたdjango-widgets-improvedをインストールする(ただしこの記事ではdjango-widget-tweaksとして説明する)。
django-widget-tweaksはテンプレートでフォームをレンダリングするときにCSSクラスやHTML属性を変更できるモジュール。

$ pip install django-widgets-improved
続きを読む

Djangoメモ(17) : フォームAPIを使用したフォームの作成とテスト

  • フォームのテストを追加
  • フォームAPI : ビュー側
  • フォームAPI : テンプレート側
  • まとめ

Python 3.6.4 Django 2.0.2

A Complete Beginner's Guide to Djangoのチュートリアルを参考にフォームAPIを使用してフォームを作成してみる。


フォームのテストを追加

前回フォームAPIを使用せずにフォームを作成したので、まずはそれに対するテストを追加する。
boards/tests.pyNewTopicTestsを以下のように編集する。

from django.urls import reverse, resolve
from django.test import TestCase
from django.contrib.auth.models import User
from .views import home, board_topics, new_topic
from .models import Board, Topic, Post

class NewTopicTests(TestCase):
    def setUp(self):
        Board.objects.create(name='Django', description='Django board.')
        User.objects.create_user(username='john', email='john@doe.com', password='123')  # <- included this line here

    # ...

    def test_csrf(self):
        url = reverse('new_topic', kwargs={'pk': 1})
        response = self.client.get(url)
        self.assertContains(response, 'csrfmiddlewaretoken')

    def test_new_topic_valid_post_data(self):
        url = reverse('new_topic', kwargs={'pk': 1})
        data = {
            'subject': 'Test title',
            'message': 'Lorem ipsum dolor sit amet'
        }
        response = self.client.post(url, data)
        self.assertTrue(Topic.objects.exists())
        self.assertTrue(Post.objects.exists())

    def test_new_topic_invalid_post_data(self):
        '''
        Invalid post data should not redirect
        The expected behavior is to show the form again with validation errors
        '''
        url = reverse('new_topic', kwargs={'pk': 1})
        response = self.client.post(url, {})
        self.assertEquals(response.status_code, 200)

    def test_new_topic_invalid_post_data_empty_fields(self):
        '''
        Invalid post data should not redirect
        The expected behavior is to show the form again with validation errors
        '''
        url = reverse('new_topic', kwargs={'pk': 1})
        data = {
            'subject': '',
            'message': ''
        }
        response = self.client.post(url, data)
        self.assertEquals(response.status_code, 200)
        self.assertFalse(Topic.objects.exists())
        self.assertFalse(Post.objects.exists())
続きを読む

Djangoメモ(16) : フォームAPIを使わずにフォームを作成

  • フォームを表示するページ作成
  • フォーム作成
  • ビューの処理
  • Topic一覧表示
  • Topic作成ボタン追加
  • まとめ

Python 3.6.4 Django 2.0.2

A Complete Beginner's Guide to Djangoのチュートリアルを参考にフォームを作成してみる。


フォームを表示するページ作成

DjangoではフォームAPIを使ってフォームを作成するが、理解を深めるためにまずはフォームAPIを使わずにフォームを作成してみる。そして、その後でフォームAPIを使ってフォームを作成する。
今回作成するフォームは新しいTopic(Board内のスレッド)とPost(Topicに対する返信だが、Topic作成時のメッセージも含む)を作成するフォームで完成形は下図。実際は誰がTopicとPostを作成したかを管理するがユーザ認証等については後で考える。

f:id:wonder-wall:20180315222108p:plain

続きを読む

Djangoメモ(15) : runserver_plusで対話型シェルを使ったデバッグ

  • Django Extensions, Werkzeugのインストール
  • runserver_plusの使い方
  • まとめ

Python 3.6.4 Django 2.0.2

A Complete Beginner's Guide to Djangoのチュートリアルを参考に掲示板アプリを作成中。


Django Extensions, Werkzeugのインストール

アプリを作成中だがデバッグしやすいようにDjango Extensionsに含まれるrunserver_plusを使ってみる。

github.com

Django ExtensionsはDjangoの拡張機能を集めたパッケージでpipでインストールできる。
runserver_plusを使用するにはWerkzeug(ドイツ語で工具、道具という意味)というWSGI Webアプリケーションライブラリが必要なので併せてインストールする。

$ pip install django-extensions Werkzeug
続きを読む