Django系列教程(4)——实例项目使命管理小应用

打印 上一主题 下一主题

主题 960|帖子 960|积分 2880

目录
第一步:创建tasks应用,参加INSTALLED_APPS
第二步:创建Task模型及其关联表单
第三步:编写路由URLConf及视图
第四步:编写模板
第五步:运行项目,查看结果
GitHub源码地点
小结


本例中我们只讲述焦点逻辑,不浪费时间在前端样式上。文末有GitHub源码地点,内里同时包含了函数视图和基于类的视图, 详细演示结果如下所示:


第一步:创建tasks应用,参加INSTALLED_APPS

本例假设你已经有了一个mysite的Django项目。我们首先使用 python manage.py startapp tasks 创建一个名为”tasks”的app,并把它计入到settings.py的INSTALLED_APPS中去。
  1. # mysite/settings.py
  2. INSTALLED_APPS = [
  3.      'django.contrib.admin',
  4.      'django.contrib.auth',
  5.      'django.contrib.contenttypes',
  6.      'django.contrib.sessions',
  7.      'django.contrib.messages',
  8.      'django.contrib.staticfiles',
  9.      'tasks',
  10. ]
复制代码
然后把app下的urls路径添加到项目文件夹的urls.py里去。
  1. from django.contrib import admin
  2. from django.urls import path, include
  3. urlpatterns = [
  4.      path('admin/', admin.site.urls),
  5.      path('tasks/', include('tasks.urls'))
  6. ]
复制代码
第二步:创建Task模型及其关联表单

我们的Task模型非常简单,仅包含name和status两个字段。我们还使用ModelForm类创建了TaskForm,我们在创建使命或更新使命时必要用到这个表单。
  1. # tasks/models.py
  2. from django.db import models
  3. class Status(models.TextChoices):
  4.      UNSTARTED = 'u', "Not started yet"
  5.      ONGOING = 'o', "Ongoing"
  6.      FINISHED = 'f', "Finished"
  7. class Task(models.Model):
  8.      name = models.CharField(verbose_name="Task name", max_length=65, unique=True)
  9.      status = models.CharField(verbose_name="Task status", max_length=1, choices=Status.choices)
  10.      def __str__(self):
  11.          return self.name
  12. # tasks/forms.py
  13. from .models import Task
  14. from django import forms
  15. class TaskForm(forms.ModelForm):
  16.      class Meta:
  17.          model = Task
  18.          fields = "__all__"
复制代码
第三步:编写路由URLConf及视图

我们必要创建5个urls, 对应5个函数视图。这是由于对于Retrieve利用,我们必要编写两个函数视图,一个用户获取使命列表,一个用于获取使命详情。对于task_detail, task_update和task_delete这个三个视图函数,我们还必要通过urls通报使命id或pk参数,否则它们不知道对哪个对象进行利用。
  1. # tasks/urls.py
  2. from django.urls import path, re_path
  3. from . import views
  4. # namespace
  5. app_name = 'tasks'
  6. urlpatterns = [
  7.      # Create a task
  8.      path('create/', views.task_create, name='task_create'),
  9.      # Retrieve task list
  10.      path('', views.task_list, name='task_list'),
  11.      # Retrieve single task object
  12.      re_path(r'^(?P<pk>\d+)/$', views.task_detail, name='task_detail'),
  13.      # Update a task
  14.      re_path(r'^(?P<pk>\d+)/update/$', views.task_update, name='task_update'),
  15.      # Delete a task
  16.      re_path(r'^(?P<pk>\d+)/delete/$', views.task_delete, name='task_delete'),
  17. ]
复制代码
下面5个函数视图代码是本应用的焦点代码,请细致阅读并去尝试明白每一行代码。
  1. # tasks/views.py
  2. from django.shortcuts import render, redirect, get_object_or_404
  3. from django.urls import reverse
  4. from .models import Task
  5. from .forms import TaskForm
  6. # Create a task
  7. def task_create(request):
  8.      # 如果用户通过POST提交,通过request.POST获取提交数据
  9.      if request.method == "POST":
  10.          # 将用户提交数据与TaskForm表单绑定
  11.          form = TaskForm(request.POST)
  12.          # 表单验证,如果表单有效,将数据存入数据库
  13.          if form.is_valid():
  14.              form.save()
  15.              # 跳转到任务清单
  16.              return redirect(reverse("tasks:task_list"))
  17.      else:
  18.          # 否则空表单
  19.          form = TaskForm()
  20.      return render(request, "tasks/task_form.html", { "form": form, })
  21. # Retrieve task list
  22. def task_list(request):
  23.      # 从数据库获取任务清单
  24.      tasks = Task.objects.all()
  25.      # 指定渲染模板并传递数据
  26.      return render(request, "tasks/task_list.html", { "tasks": tasks,})
  27. # Retrieve a single task
  28. def task_detail(request, pk):
  29.      # 从url里获取单个任务的pk值,然后查询数据库获得单个对象
  30.      task = get_object_or_404(Task, pk=pk)
  31.      return render(request, "tasks/task_detail.html", { "task": task, })
  32. # Update a single task
  33. def task_update(request, pk):
  34.      # 从url里获取单个任务的pk值,然后查询数据库获得单个对象实例
  35.      task_obj = get_object_or_404(Task, pk=pk)
  36.      if request.method == 'POST':
  37.          form = TaskForm(instance=task_obj, data=request.POST)
  38.          if form.is_valid():
  39.              form.save()
  40.              return redirect(reverse("tasks:task_detail", args=[pk,]))
  41.      else:
  42.          form = TaskForm(instance=task_obj)
  43.      return render(request, "tasks/task_form.html", { "form": form, "object": task_obj})
  44. # Delete a single task
  45. def task_delete(request, pk):
  46.      # 从url里获取单个任务的pk值,然后查询数据库获得单个对象
  47.      task_obj = get_object_or_404(Task, pk=pk)
  48.      task_obj.delete() # 删除然后跳转
  49.      return redirect(reverse("tasks:task_list"))
复制代码
第四步:编写模板

虽然我们有5个urls,但我们只必要创建3个模板:task_list.html, task_detail.html 和task_form.html。 最后一个模板由task_create 和task_update 视图函数共享。我们在模板中对实例对象进行判定,如果对象已存在则模板对于更新使命,否则是创建使命。task_delete视图不必要模板。
  1. # tasks/templates/tasks/task_list.html
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5.      <meta charset="UTF-8">
  6.      <title>Task List</title>
  7. </head>
  8. <body>
  9. <h3>Task List</h3>
  10. {% for task in tasks %}
  11.      <p>{{ forloop.counter }}. {{ task.name }} - {{ task.get_status_display }}
  12.          (<a href="{% url 'tasks:task_update' task.id %}">Update</a> |
  13.          <a href="{% url 'tasks:task_delete' task.id %}">Delete</a>)
  14.      </p>
  15. {% endfor %}
  16. <p> <a href="{% url 'tasks:task_create' %}"> + Add A New Task</a></p>
  17. </body>
  18. </html>
  19. # tasks/templates/tasks/task_detail.html
  20. <!DOCTYPE html>
  21. <html lang="en">
  22. <head>
  23.      <meta charset="UTF-8">
  24.      <title>Task Detail</title>
  25. </head>
  26. <body>
  27. <p> Task Name: {{ task.name }} | <a href="{% url 'tasks:task_update' task.id %}">Update</a> |
  28.      <a href="{% url 'tasks:task_delete' task.id %}">Delete</a>
  29. </p>
  30. <p> Task Status: {{ task.get_status_display }} </p>
  31. <p> <a href="{% url 'tasks:task_list' %}">View All Tasks</a> |
  32.      <a href="{% url 'tasks:task_create'%}">New Task</a>
  33. </p>
  34. </body>
  35. </html>
  36. # tasks/templates/tasks/task_form.html
  37. <!DOCTYPE html>
  38. <html lang="en">
  39. <head>
  40.      <meta charset="UTF-8">
  41.      <title>{% if object %}Edit Task {% else %} Create New Task {% endif %}</title>
  42. </head>
  43. <body>
  44. <h3>{% if object %}Edit Task {% else %} Create New Task {% endif %}</h3>
  45.      <form action="" method="post" enctype="multipart/form-data">
  46.          {% csrf_token %}
  47.          {{ form.as_p }}
  48.          <p><input type="submit" class="btn btn-success" value="Submit"></p>
  49.      </form>
  50. </body>
  51. </html>
复制代码
第五步:运行项目,查看结果

运行如下下令,访问http://127.0.0.1:8000/tasks/就应该看到文初结果了。
  1. python manage.py makemigrations
  2. python manage.py migrate
  3. python manage.py runserver
复制代码
GitHub源码地点

本项目源码地点,内里同时包含了函数视图和基于类的视图。
小结

本例中我们使用了函数视图(functional-based views, FBV)编写了一个使命管理的CRUD小应用,后面我们将使用基于类的视图(class-based views, CBV)重写本例演示代码。
接下来几章我们将详细先容模型、视图、URL的设置以及模板的根本知识,接待关注。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

何小豆儿在此

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表