Rumah >pembangunan bahagian belakang >Tutorial Python >Mencipta apl Tugasan dengan Django dan HTMX - Bahagian Menambah model Todo dengan TDD

Mencipta apl Tugasan dengan Django dan HTMX - Bahagian Menambah model Todo dengan TDD

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-04 07:05:34511semak imbas

Ini adalah siaran kedua siri kami tentang cara membina apl Todo menggunakan HTMX dan Django. Klik di sini untuk bahagian 1.

Dalam bahagian 2, kami akan mencipta model Todo dan melaksanakan fungsi asasnya dengan ujian unit.

Mencipta model Todo

Dalam models.py mari buat model Todo, dengan atribut asasnya. Kami mahu item Todo dikaitkan dengan UserProfile, supaya pengguna hanya akan melihat item mereka sendiri. Item todo juga akan mempunyai tajuk dan atribut boolean is_completed. Kami mempunyai banyak idea masa depan untuk model Todo, seperti keupayaan untuk menetapkan tugas sebagai "sedang berjalan" selain selesai atau tidak dimulakan, dan tarikh akhir, tetapi itu untuk kemudian. Mari kita permudahkan sekarang untuk mempunyai sesuatu pada skrin secepat mungkin.

Nota: Dalam apl dunia sebenar, kita mungkin perlu mempertimbangkan untuk menggunakan UUID sebagai kunci utama pada model UserProfile dan Todo, tetapi kami akan memastikannya mudah sekarang.

# core/models.py

from django.contrib.auth.models import AbstractUser
from django.db import models  # <-- NEW

class UserProfile(AbstractUser):
    pass

# NEW
class Todo(models.Model):
    title = models.CharField(max_length=255)
    is_completed = models.BooleanField(default=False)
    user = models.ForeignKey(
        UserProfile,
        related_name="todos",
        on_delete=models.CASCADE,
    )
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

Mari jalankan migrasi untuk model baharu:

❯ uv run python manage.py makemigrations
Migrations for 'core':
  core/migrations/0002_todo.py
    + Create model Todo
❯ uv run python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, core, sessions
Running migrations:
  Applying core.0002_todo... OK

Menulis ujian pertama kami

Mari kita tulis ujian pertama pada projek kami. Kami ingin memastikan bahawa pengguna hanya akan melihat item todo mereka sendiri, dan bukan item daripada pengguna lain.

Untuk membantu kami menulis ujian, kami akan menambah kebergantungan pembangunan baharu pada projek kami, model-bakeri, yang memudahkan proses mencipta contoh model Django tiruan. Kami juga akan menambah pytest-django.

❯ uv add model-bakery pytest-django --dev
Resolved 27 packages in 425ms
Installed 2 packagez in 12ms
 + model-bakery==1.20.0
 + pytest-django==4.9.0

Dalam pyproject.toml kita perlu mengkonfigurasi pytest, dengan menambah beberapa baris pada penghujung fail:

# pyproject.toml

# NEW
[tool.pytest.ini_options]
DJANGO_SETTINGS_MODULE = "todomx.settings"
python_files = ["test_*.py", "*_test.py", "testing/python/*.py"]

Sekarang mari tulis ujian pertama kami untuk memastikan pengguna hanya mempunyai akses kepada tugas mereka sendiri.

# core/tests/test_todo_model.py

import pytest


@pytest.mark.django_db
class TestTodoModel:
    def test_todo_items_are_associated_to_users(self, make_todo, make_user):
        [user1, user2] = make_user(_quantity=2)

        for i in range(3):
            make_todo(user=user1, title=f"user1 todo {i}")

        make_todo(user=user2, title="user2 todo")

        assert {todo.title for todo in user1.todos.all()} == {
            "user1 todo 0",
            "user1 todo 1",
            "user1 todo 2",
        }

        assert {todo.title for todo in user2.todos.all()} == {"user2 todo"}

Kami menggunakan fail conftest.py daripada pytest untuk mempunyai tempat untuk semua lekapan yang kami rancang untuk digunakan dalam ujian kami. Pustaka model_bakery memudahkan untuk membuat contoh UserProfile dan Todo dengan boilerplate minimum.

#core/tests/conftest.py

import pytest
from model_bakery import baker


@pytest.fixture
def make_user(django_user_model):
    def _make_user(**kwargs):
        return baker.make("core.UserProfile", **kwargs)

    return _make_user


@pytest.fixture
def make_todo(make_user):
    def _make_todo(user=None, **kwargs):
        return baker.make("core.Todo", user=user or make_user(), **kwargs)

    return _make_todo

Jom jalankan ujian kami!

❯ uv run pytest
Test session starts (platform: darwin, Python 3.12.8, pytest 8.3.4, pytest-sugar 1.0.0)
django: version: 5.1.4, settings: todomx.settings (from ini)
configfile: pyproject.toml
plugins: sugar-1.0.0, django-4.9.0
collected 1 item

 core/tests/test_todo_model.py ✓                                                                                                                                   100% ██████████

Results (0.25s):
       1 passed

Daftar halaman pentadbir untuk Todos

Akhir sekali, kami boleh mendaftarkan halaman admin untuknya:

# core/admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import Todo, UserProfile # <-- NEW

# .. previous code

# NEW
@admin.register(Todo)
class TodoAdmin(admin.ModelAdmin):
    model = Todo
    list_display = ["title", "is_completed", "user"]
    list_filter = ["is_completed"]
    search_fields = ["title"]
    list_per_page = 10
    ordering = ["title"]

Kini kami boleh menambah beberapa Todo daripada pentadbir!

Creating a To-Do app with Django and HTMX - Part Adding the Todo model with TDD

Jika anda ingin menyemak keseluruhan kod sehingga akhir bahagian 2, anda boleh menyemaknya di Github di cawangan bahagian 02.

Atas ialah kandungan terperinci Mencipta apl Tugasan dengan Django dan HTMX - Bahagian Menambah model Todo dengan TDD. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn