hotamul의 개발 이야기

[Django] User Model 커스터마이징 #6 (TDD) 본문

Dev./Django

[Django] User Model 커스터마이징 #6 (TDD)

hotamul 2022. 7. 13. 00:08

[Django] User Model 커스터마이징 #5 (TDD)에서 super user 생성까지 해봤다. 이제 django admin 페이지에서 UI로 user를 관리할 수 있도록 해보자.

user 목록 조회, user 수정 페이지, user 생성 페이지를 만들어보자.

user_lists, edit_user page, create_user page : test

먼저 테스트를 만들어보자.

user/test/test_admin.py를 추가하고 다음과 같이 setUp 메소드를 만든다.

"""
Tests for the Django admin modifications.
"""
from django.test import TestCase
from django.contrib.auth import get_user_model
from django.urls import reverse
from django.test import Client


class AdminSiteTests(TestCase):
    """Tests for Django admin."""

    def setUp(self):
        """Create user and client."""
        self.client = Client()
        self.admin_user = get_user_model().objects.create_superuser(
            email='admin@example.com',
            password='testpass123',
        )
        self.client.force_login(self.admin_user)
        self.user = get_user_model().objects.create_user(
            email='user@example.com',
            password='testpass123',
            name='Test User'
        )

setUpAdminSiteTests 클래스의 test_로 시작하는 메소드들이 실행되기 전 실행된다.
초기 setting이라고 생각하면 된다.

test 코드를 아래와 같이 작성해 보자.

...
    def test_users_lists(self):
        """Test that users are listed on page."""
        url = reverse('admin:core_user_changelist')
        res = self.client.get(url)

        self.assertContains(res, self.user.name)
        self.assertContains(res, self.user.email)

    def test_edit_user_page(self):
        """Test the edit user page works."""
        url = reverse('admin:core_user_change', args=[self.user.id])
        res = self.client.get(url)

        self.assertEqual(res.status_code, 200)

    def test_create_user_page(self):
        """Test the create user page works."""
        url = reverse('admin:core_user_add')
        res = self.client.get(url)

        self.assertEqual(res.status_code, 200)
...

user 목록을 조회하고 미리 생성했던 user@example.com 이메일을 가진 user가 있는지 확인한다.

edit_user 페이지를 조회 했을 때 status가 200인지 확인한다.

create_user 페이지를 조회 할 때 status가 200인지 확인한다.

user_lists

이제 구현 해보자. gettext_lazy는 django에서 제공하는 번역 모듈로 _ (underscore)로 alias를 준 것 뿐이다.
[django.utils.translation]https://docs.djangoproject.com/en/4.0/topics/i18n/translation/

"""
Django admin customizations.
"""
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.utils.translation import gettext_lazy as _

from core import models


class UserAdmin(BaseUserAdmin):
    """Define the admin pages for users."""
    ordering = ['id']
    list_display = ['email', 'name']
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        (_('Personal Info'), {'fields': ('name',)}),
        (
            _('Permissions'),
            {
                'fields': (
                    'is_active',
                    'is_staff',
                    'is_superuser',
                )
            }
        ),
        (_('Important dates'), {'fields': ('last_login',)}),
    )
    readonly_fields = ['last_login']
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': (
                'email',
                'password1',
                'password2',
                'name',
                'is_active',
                'is_staff',
                'is_superuser',
            ),
        }),
    )


admin.site.register(models.User, UserAdmin)

이제 테스트를 실행해보면

짜잔!

Comments