利用Django提供的ModelForm增刪改數據

上一篇我們寫了Django基於類如何增刪改數據的方法,方法雖然簡單,但新手可能對其原理不是很清楚,那麼我們這次就用Django提供的ModelForm方法來實現增刪改數據,這是一種基於現有模型的增刪改方法。

一個簡單的例子加以說明,前提是你已經具備Django創建項目應用的基本知識:
01.首先創建一個簡單的模型,模型只有三個文本字段,標題title, 內容text , 添加日期date_added,如下:

# models.py

from django.db import models
from django.utils import timezone

class Article(models.Model):
    title = models.CharField('標題', max_length=100)
    text = models.TextField('內容')
    date_added = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.title

創建完模型別忘了生成數據庫,makemigrations方法(生成遷移文件),migrate(遷移到數據庫) 。

02.在項目中創建一個form.py的文件,我這裏的項目名稱是app1,在其中創建繼承一個ModelForm的表單類ArticleForm,他的子類中包含很多內置的方法,我都都可以對其覆蓋,有興趣的同學可以看官方文檔,講的非常詳細。
文檔地址:https://docs.djangoproject.com/zh-hans/2.1/topics/forms/modelforms/#django.forms.ModelForm

# form.py

from django.forms import ModelForm
from .models import Article

class ArticleForm(ModelForm):   # 繼承ModelForm類
    class Meta:
        model = Article   # 具體要操作那個模型
        fields = ['title', 'text', 'date_added']  # 允許編輯的字段

03.創建我們視圖函數,開始增刪改

# views.py

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

def articles(request):
  # 查詢列表頁面,獲取Article的所有信息
    articles = Article.objects.all()
    return render(request, 'app1/articles.html', {'articles':articles})
# 與其對應的url,在應用中的urls.py中設置
    path('article/', views.articles, name='article'),
# 添加頁面
def new_article(request):
  # 如果不是POST方法訪問
    if request.method != 'POST':
        # 創建一個空表單在頁面顯示
        form = ArticleForm()
    else:
        # 否則爲POST方式
        # request.POST方法,將會獲取到表單中我們輸入的數據
        new_article = ArticleForm(request.POST)
        # 驗證其合法性,使用is_valid()方法
        if new_article.is_valid():
            # 驗證通過,使用save()方法保存數據
            new_article.save()
            # 保存成功,使用redirect()跳轉到指定頁面
            return redirect('app1:article')
    return render(request, 'app1/new_article.html', {'form':form})
# 編輯修改頁面
def edit_article(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('app1:article') # 成功跳轉
    return render(request, 'app1/edit_article.html', {'form':form,'article':article})
# 刪除頁面
def del_article(request, article_id):
    article = Article.objects.get(id=article_id)
    if request.method == 'POST':
        article.delete()
        return redirect('app1:article')
    return render(request, 'app1/del_article.html', {'article': article})

05.設置所有視圖的url

# 列表
path('article/', views.articles, name='article'),
# 添加
path('new_article/', views.new_article, name='new_article'),
# 修改
path('edit_article/<int:article_id>/', views.edit_article, name='edit_article'),
# 刪除
path('del_article/<int:article_id>/', views.del_article, name='del_article'),

 

06.靜態頁面調用

# articles.html

 <a href="{% url 'app1:new_article' %}">添加</a>
    {% for article in articles %}
        <h1>{{ article.title }}</h1>
        <p>{{ article.text }}</p>
        <a href="{% url 'app1:edit_article' article.id %}">修改</a>
        <a href="{% url 'app1:del_article' article.id %}">刪除</a>
    {% endfor %}


# new_article.html
 <form action="{% url 'app1:new_article' %}" method="post">
        {% csrf_token %}
        {{ form.as_ul }}
        <input type="submit" value="提交">
    </form>

07.其他兩個修改和刪除頁面的模板中調用方法與new_article.html中的方法一樣,只需要更換action中的url即可。

創作不易,我會持續分享關於Django的相關知識,有興趣的朋友可以關注本人微信公衆號:幸福關中, 如果您覺得不錯的話,打賞以下小編,小編會更有動力分享更多關於Django方面的知識,歡迎大家加小編微信交流Django知識,備註Django,小編微信:xingfuguanzhong

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章