• Python + Django4 搭建个人博客(十一): 利用表单实现创建文章的功能页面


    上篇我们实现了查看文章的功能页面,但是显示的文章都是我们直接后台直接添加到数据库的。

    Python + Django4 搭建个人博客(十):实现文章详情页面_李威威wiwi的博客-CSDN博客本篇我们实现了文章详情的页面,同时通过修改模板里面的href 链接,我们增加了导航栏对首页的跳转和首页中跳转文章详情的入口。在修改href的时候,我们熟悉了path函数中的name参数,通过模板标签{% url %},我们可以通过url名字反向解析url地址,增加了url配置的灵活性。下篇我们将学习Django的Form,同时利用Form,实现创建文章的功能页面。...https://blog.csdn.net/agelee/article/details/126627508

    本篇我们就来实现一个前台创建文章的功能页面。

    创建表单

    在HTML中,表单是在

    ...
    中的一些元素,它允许访客做类似输入文本、选择选项、操作对象或空间等动作,然后发送这些信息到服务端。

    Django框架中有专门的Form组件来处理表单数据,可以极大的简化表单相关的开发工作。

    Django表单系统的核心组件是 Form,它能够描述一张表单并决定它如何工作及呈现。

    要使用Form类,我们先在article里面创建forms.py文件,并写入如下代码:

    1. # 引入表单类
    2. from django import forms
    3. # 引入文章模型
    4. from .models import Article
    5. # 写文章的表单类
    6. class ArticleForm(forms.ModelForm):
    7. class Meta:
    8. # 指明数据模型来源
    9. model = Article
    10. # 定义表单包含的字段
    11. fields = ('title', 'body')

    这里我们使用了Form类下面的ModelForm类。

    Django允许从一个模型中创建一个表单类,新建的表单类通过继承forms.ModelForm类和定义模型属性来与模型关联起来。

    并在类中定义了内部类class Meta,指明了数据模型的来源,以及表单中应该包含数据模型的哪些字段。

    创建视图函数

    接下来,我们新建一个视图函数来处理文章创建的请求。

    Article模型中,createdupdated字段为自动生成,不需要填入,作者一般就是登陆用户,只有文章标题和内容是需要填写的内容。

    打开article/views.py,添加一个视图函数以处理写文章的请求:

    1. # 引入redirect用于重定向地址
    2. from django.shortcuts import render, redirect
    3. # 引入刚才定义的ArticleForm表单类
    4. from .forms import ArticleForm
    5. # 写文章的视图
    6. def article_create(request):
    7. # 判断用户是否提交数据
    8. if request.method == "POST":
    9. # 将提交的数据赋值到表单实例中
    10. article_post_form = ArticleForm(data=request.POST)
    11. # 判断提交的数据是否满足模型的要求
    12. if article_post_form.is_valid():
    13. # 保存数据,但暂时不提交到数据库中
    14. new_article = article_post_form.save(commit=False)
    15. # 作者为当前请求的用户名
    16. new_article.author = request.user
    17. # 将新文章保存到数据库中
    18. new_article.save()
    19. # 完成后返回到文章列表
    20. return redirect("list")
    21. # 如果数据不合法,返回错误信息
    22. else:
    23. return HttpResponse("表单内容有误,请重新填写。")
    24. # 如果用户请求获取数据
    25. else:
    26. # 创建表单类实例
    27. article_post_form = ArticleForm()
    28. # 赋值上下文
    29. context = { 'article_post_form': article_post_form }
    30. # 返回模板
    31. return render(request, 'article/create.html', context)

    此视图函数说明如下:

    当视图函数接收到一个客户端的request请求时,首先根据request.method判断用户是要提交数据(POST)、还是要获取数据(GET)

    • 如果用户是提交数据,将POST给服务器的表单数据赋于article_post_form实例。然后使用Django内置的方法.is_valid()判断提交的数据是否满足模型的要求。
    • 如果满足要求,保存表单中的数据(但是commit=False暂时不提交到数据库,因为author还未指定),并指定author为当前登陆用户。然后提交到数据库,并通过redirect返回文章列表。redirect可通过url地址的名字,反向解析到对应的url
    • 如果不满足要求,则返回一个字符串"表单内容有误,请重新填写。",告诉用户出现了什么问题。
    • 如果用户是获取数据,则返回一个空的表单类对象,提供给用户填写。

    创建模板

    写好视图之后,就需要写模板文件了。在templates/article/中创建create.html

    1. {% extends "base.html" %}
    2. {% load static %}
    3. {% block title %} 写文章 {% endblock title %}
    4. {% block content %}
    5. class="container">
    6. class="row">
    7. class="col-12">

    8. "post" action=".">
    9. {% csrf_token %}
    10. class="form-group">
    11. <input type="text" class="form-control" id="title" name="title">
  • class="form-group">

  • {% endblock content %}
  • html文件很长。看不懂html文件语法也没有关系,可以先照着抄一遍,以后再慢慢理解,不影响目前Django的学习。