feat(projects): 新增Django综合案例示例代码及素材

This commit is contained in:
100gle
2022-08-10 16:15:39 +08:00
parent b4c2257308
commit 3bf65b2755
65 changed files with 1496 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class PopupConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'popup'

View File

@@ -0,0 +1,35 @@
# Generated by Django 4.0.4 on 2022-06-28 13:48
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Group',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(default='收集箱', max_length=100, unique=True, verbose_name='分类名称')),
],
),
migrations.CreateModel(
name='Task',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100, verbose_name='任务名称')),
('priority', models.IntegerField(choices=[(0, '一般'), (1, '优先'), (3, '紧急')], default=0, verbose_name='任务优先级')),
('description', models.TextField(blank=True, max_length=500, null=True, verbose_name='任务描述')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('is_done', models.BooleanField(choices=[(False, '未完成'), (True, '已完成')], default=False, verbose_name='是否完成')),
('group', models.ForeignKey(default=0, on_delete=django.db.models.deletion.DO_NOTHING, to='popup.group', verbose_name='所属分类')),
],
),
]

View File

@@ -0,0 +1,47 @@
from django.db import models
class Task(models.Model):
"""the task record in todolist"""
priority_choices = (
(0, "一般"),
(1, "优先"),
(3, "紧急"),
)
is_done_choices = (
(False, "未完成"),
(True, "已完成"),
)
name = models.CharField(max_length=100, verbose_name="任务名称")
priority = models.IntegerField(
choices=priority_choices, default=0, verbose_name="任务优先级"
)
description = models.TextField(
max_length=500, verbose_name="任务描述", blank=True, null=True
)
created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")
is_done = models.BooleanField(
default=False, verbose_name="是否完成", choices=is_done_choices
)
group = models.ForeignKey(
"Group", on_delete=models.DO_NOTHING, default=0, verbose_name="所属分类"
)
def __repr__(self):
return f"<Task {self.name}>"
class Group(models.Model):
name = models.CharField(
max_length=100,
default="收集箱",
unique=True,
verbose_name="分类名称",
)
def __repr__(self):
return f"<Group '{self.name}'>"

View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

View File

@@ -0,0 +1,12 @@
from django.urls import path
from .views import about, create_task, delete_task, index, query_all_tasks, update_task
urlpatterns = [
path("", index, name="index"),
path("about/", about, name="about"),
path("tasks/", query_all_tasks, name="tasks"),
path("tasks/create/", create_task, name="create_task"),
path("tasks/update/<int:task_id>/", update_task, name="update_task"),
path("tasks/delete/<int:task_id>/", delete_task, name="delete_task"),
]

View File

@@ -0,0 +1,112 @@
from django.http.response import HttpResponseNotAllowed
from django.shortcuts import redirect, render
from django.utils.html import format_html
from .models import Group, Task
def index(request):
welcome = "欢迎来到 Todolist 练习项目 Popup 应用主页!"
index_content = format_html(
"""
这是<a href="https://sspai.com/series/271" style="text-decoration: none;">《100 小时后请叫我程序员》</a>课程用于进行 Django 实践练习的网站,主要包括了以下几部分:
<ul>
<li><b>少数派 Logo</b>:你可以点击跳转至少数派首页;</li>
<li><b>Home</b>:即当前页面;</li>
<li><b>Task</b>:用于实践的待办清单页面,你可以在里面创建、更新以及删除任务;</li>
<li><b>About</b>:对个人或网站信息进行简要说明的介绍页。</li>
</ul>
"""
)
ctx = dict(
title="home",
welcome=welcome,
index_content=index_content,
)
return render(request, "index.html", context=ctx)
def about(request):
title = "About"
header = f"{title} Me"
about_content = """
这是一段简单的About Me 页面。
它可以用来展示关于个人的一些信息,或者是简单的介绍。
例如:
""".strip().splitlines()
items = [
("昵称", "100gle"),
("职业", "少数派作者"),
("编程语言", "Python、Golang、JavaScript 等等"),
]
ctx = dict(
title=title,
header=header,
about_content=about_content,
items=items,
)
return render(request, "about.html", context=ctx)
def query_all_tasks(request):
tasks = Task.objects.all()
fields = ["序号", "任务名称", "优先级", "任务描述", "是否完成", "分组"]
if Group.objects.count() == 0:
groups = [
Group(name="收集箱"),
Group(name="生活"),
Group(name="工作"),
]
Group.objects.bulk_create(groups)
groups = Group.objects.all()
ctx = dict(
title="Task",
tasks=tasks,
fields=fields,
groups=groups,
)
return render(request, "tasks.html", context=ctx)
def create_task(request):
"""create a task"""
if request.method == "POST":
name = request.POST.get("taskName")
priority = request.POST.get("taskPriority")
description = request.POST.get("taskDescription")
group_id = request.POST.get("taskGroup")
group = Group.objects.get(id=group_id)
Task.objects.create(
name=name, priority=priority, description=description, group=group
)
return redirect("/tasks/")
else:
return HttpResponseNotAllowed(["POST"])
def update_task(request, task_id):
"""update a task"""
task = Task.objects.get(id=task_id)
task.is_done = False if task.is_done else True
task.save()
return redirect("/tasks/")
def delete_task(request, task_id):
"""delete a task"""
task = Task.objects.get(id=task_id)
task.delete()
return redirect("/tasks/")