首页Django

Django基于ModelForm的数据库操作

2020年9月9日 19:081325

Django是Python中非常优秀的web框架,可以用来编写网站、博客、电商、企业软件。今天小编打算用Django提供的ModelForm操作数据库实现简单的增删改查,这种方法不用考虑SQL语句如何实现。

# 操作环境

1.Python 3.8
2.Django 3.0.2
3.Pycharm 2019.3
4.mysql   8.0.18

# 以下操作使用Pycharm完成,创建项目(mysite),创建应用(blog)

第一步:创建数据模型

# 模型名称:Article
# 模型字段:title、body、pub_time

# models.py

from.django.db import models


class Article(models.Model):
    title = models.CharField('标题', max_length=128)
    body = models.TextField('内容')
    pub_time = models.DateTimeField('发布时间', auto_now_add=True)

    class Meta:
        verbose_name_plural = verbose_name = '文章管理'

    def __str__(self):
        return self.title

第二步:数据迁移

# 1.生成迁移文件
python manage.py makemigrations
# 2.执行数据迁移
python manage.py migrate
#3.在需要的情况下,创建后台超级用户
python manage.py createsuperuser

第三步:创建form.py(views.py同级目录)

# form.py

from django.forms import ModelForm
from blog.models import Article


class ArticleForm(ModelForm):  # 继承ModelForm类
    class Meta:
        model = Article  # 操作的数据模型
        fields = ['title','body']  # 允许编辑的字段(pub_time定义的不可编辑)

第四步:创建视图,操作数据

# views.py

from django.shortcuts import render, redirect 
from blog.models import Article
from blog.form import ArticleForm


def index(request):
    # 首页,获取Article所有数据
    articles = Article.objects.all()
    return render(request,'index.html',{'articles':articles})
# 对应的url,在urls.py文件中设置
    path('',views.index,name='index')  # 引号中间为空表示首页
# 添加数据的视图

def add(request):
    # 如果不是POST方法访问
    if request.method != 'POST':
        # 创建一个空表单在页面显示
        form = ArticleForm()
    else:
        # 否则为POST方式
        # request.POST方法获取表单中输入的数据
        add_article = ArticleForm(request.POST)
        # 使用is_valid()验证输入合法性
        if add_article.is_valid():
            # 验证通过,使用save方法保存数据
            add_article.save()
            #保存成功后,使用redirect()重定向指定页面
            return redirect('/')
    return render(request,'add_article.html',{'form':form})
# 编辑数据的视图

def update(request,article_id):
    # 查询到指定的数据
    article = Article.objects.get(id=article_id)
    if request.method !='POST':
        # 如果不是POST,创建一个表单,并用instance=article当前数据填充表单
        form = ArticleForm(instance=article)
    else:
        # 如果是POST,instance=article当前数据填充表单,并用data=request.POST获取到表单里的内容
        form = ArticleForm(instance=article,data=request.POST)
        form.save()
        if form.is_valid():
            return redirect('/')
    return render(request,'edit.html',{'form':form,'article':article})
# 删除数据的视图
# 这里删除数据是直接在首页执行,不需要另建模板
def delete(request,article_id):
    article = Article.objects.get(id=article_id)
    if not article:
        message = '删除失败'
    else:
        article.delete()
        return redirect('/')
    return render(request,'del.html',{'article':article})

第五步:设置所有视图的url

# urls.py

from django.urls import path
from blog import views

urlpatterns = [
    path('',views.index,name='index'),  #首页
    path('add/',views.add,name='add'),    #添加数据
    path('update/<int:article_id>',views.update,name='update'), #编辑数据
    path('delete/<int:article_id>',views.delete,name='delete'),    #删除数据
]

第六步:静态模板调用

<!--index.html-->

<table>
    <thead>
        <tr>
            <th>编号</th>
            <th>标题</th>
            <th>内容</th>
            <th>创建时间</th>
            <th>操作</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            {% for article in articles %}
            <td>{{ article.id }}</td>
            <td>{{ article.title }}</td>
            <td>{{ article.body }}</td>
            <td>{{ article.pub_time }}</td>
            <td>
                <a href="{% url 'edit' article.id %}">编辑</a>
                <a href="{% url 'delete' article.id %}">删除</a>
            </td>
            {% endfor %}
        </tr>
    </tbody>
</table>
<!--add.html-->

<form action="{% url 'add' %}" method='post'>
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value='提交'>
</form>
<!--edit.html-->

<form action="{% url 'edit' article.id %}" method='post'>
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value='提交'>
</form>