feat(projects): 新增Django综合案例示例代码及素材
This commit is contained in:
0
projects/web-django/todolist/popup/__init__.py
Normal file
0
projects/web-django/todolist/popup/__init__.py
Normal file
3
projects/web-django/todolist/popup/admin.py
Normal file
3
projects/web-django/todolist/popup/admin.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
6
projects/web-django/todolist/popup/apps.py
Normal file
6
projects/web-django/todolist/popup/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class PopupConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'popup'
|
||||
@@ -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='所属分类')),
|
||||
],
|
||||
),
|
||||
]
|
||||
47
projects/web-django/todolist/popup/models.py
Normal file
47
projects/web-django/todolist/popup/models.py
Normal 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}'>"
|
||||
3
projects/web-django/todolist/popup/tests.py
Normal file
3
projects/web-django/todolist/popup/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
12
projects/web-django/todolist/popup/urls.py
Normal file
12
projects/web-django/todolist/popup/urls.py
Normal 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"),
|
||||
]
|
||||
112
projects/web-django/todolist/popup/views.py
Normal file
112
projects/web-django/todolist/popup/views.py
Normal 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/")
|
||||
Reference in New Issue
Block a user