如何在Django中建立和使用訊號?


Django是一個Python web框架,開發者使用它可以更快地開發web應用程式並編寫簡潔易懂的程式碼。此外,Django是一個功能豐富的應用程式,它包含許多特性,包括Django訊號。

在Django中,訊號用於在發生任何事件時觸發某些函式。例如,當用戶對資料庫進行一些更改時,我們可以觸發一個特定的函式,該函式可以在網頁上向用戶顯示這些更改。

Django包含三種類型的訊號,我們在下面解釋。

  • pre_save/post_save − 每當使用者儲存資料庫中的任何物件時,它都會觸發操作。

  • pre_delete/post_delete − 每當使用者想要從資料庫中刪除物件時,它都會自動觸發。

  • pre_init/post_init − 每當在資料庫中建立新模型時,它都會被觸發。

在本教程中,我們將學習如何在Django中使用訊號。在這裡,我們將從頭開始建立一個應用程式並新增程式碼來建立訊號。

使用者應按照以下步驟在Django應用程式中建立訊號。

  • 步驟1 − 首先,如果尚未安裝,請在終端中執行以下命令在本地計算機上安裝Django。

pip install Django
  • 步驟2 − 現在,在終端中執行以下命令以建立新的Django專案。

django-admin startproject django_demo
  • 步驟3 − 之後,在終端中執行以下命令以更改終端中的目錄並建立一個名為“firstApp”的新應用程式。

cd django_demo
python manage.py startapp firstApp
  • 步驟4 − 接下來,我們需要在“firstApp”資料夾內建立一個urls.py檔案,並在檔案中新增以下程式碼。

from django.urls import path
from . import views
urlpatterns = [
   path('', views.create_user)
]
  • 步驟5 − 我們還需要設定django專案的urls.py檔案。開啟位於django_demo資料夾內的urls.py檔案,並將以下程式碼新增到檔案中。

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
   path('admin/', admin.site.urls),
   # here, firstApp is a app name
   path('', include("firstApp.urls")),
]

在上面的程式碼中,我們包含了“firstApp”的URL。

  • 步驟6 − 現在,我們需要將“firstApp”新增到django_demo資料夾的settings.py檔案中。開啟settings.py檔案,並將當前程式碼替換為以下程式碼。

INSTALLED_APPS = [
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'firstApp',
]

在上面的程式碼中,我們已將“firstApp”新增到INSTALLED_APPS陣列中。

  • 步驟7 − 現在,我們將建立一個模型以將使用者資料儲存到資料庫中。開啟“firstApp”目錄內的models.py檔案,並將以下程式碼新增到其中。

from django.db import models

class User(models.Model):
   # Adding the name
   name = models.CharField(max_length=100)
   # Adding the email
   email = models.EmailField()

   def __str__(self):
      return self.name

在上面的程式碼中,我們建立了包含姓名和電子郵件欄位的“User”模型。

之後,在終端中逐一執行以下兩個命令以遷移資料庫。

python manage.py makemigrations
python manage.py migrate
  • 步驟8 − 現在,在“firstApp”目錄中建立一個“signals.py”檔案,並新增以下程式碼以建立訊號。

from django.db.models.signals import post_save
from django.dispatch import receiver
from firstApp.models import User

@receiver(post_save, sender=User)
def user_created(sender, instance, created, **kwargs):
   if created:
      print('A new user was created:', instance.name, instance.email)

在上面的程式碼中,我們使用了帶有“User”模型的“post_save”訊號。因此,每當在資料庫中儲存新使用者時,它都會呼叫user_created()函式。成功建立使用者後,它會在控制檯中列印使用者的姓名和電子郵件。

  • 步驟9 − 我們還需要在app.py檔案中註冊訊號。開啟app.py檔案,並將以下程式碼新增到檔案中。

from django.apps import AppConfig

class FirstappConfig(AppConfig):
   default_auto_field = 'django.db.models.BigAutoField'
   name = 'firstApp'

   def ready(self):
      import firstApp.signals
  • 步驟10 − 接下來,讓我們建立一個表單來獲取使用者輸入。在“firstApp”目錄中建立一個forms.py檔案,並在檔案中新增以下程式碼。

from django import forms
from firstApp.models import User

class UserForm(forms.ModelForm):
   class Meta:
      model = User
      fields = ('name', 'email')

在上面的程式碼中,我們匯入了User模型並建立了UserForm類。

  • 步驟11 − 接下來,讓我們在views.py檔案中建立一個create_user檢視來處理表單提交。開啟views.py檔案,並在檔案中新增以下程式碼。

from django.shortcuts import render
from firstApp.forms import UserForm

def create_user(request):
   # If the form is submitted, save the user. Otherwise, just create an empty form.
   if request.method == 'POST':
      form = UserForm(request.POST)
      if form.is_valid():
         form.save()
   else:
      form = UserForm()
      # send the base.html file on the response.
   return render(request, 'base.html', {'form': form})

在上面的程式碼中,我們檢查方法是否為POST,如果所有表單引數有效則儲存表單。否則,我們將表單顯示給使用者而不儲存表單資料。此外,我們向用戶呈現“base.html”模板。

  • 步驟12 − 現在,我們需要建立“base.html”模板。在此之前,在“firstApp”資料夾中建立一個“templates”目錄。之後,開啟“settings.py”檔案,並將以下程式碼替換為舊程式碼。

TEMPLATES = [{
      'BACKEND': 'django.template.backends.django.DjangoTemplates',
      'DIRS': [os.path.join(BASE_DIR, 'templates')],
      'APP_DIRS': True,
      'OPTIONS': {
         'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
         ],
      },
   },
]

在上面的程式碼中,我們已將“templates”目錄的路徑新增為“DIRS”屬性的值。

  • 步驟13 − 接下來,在“templates”目錄內建立一個base.html檔案,並在檔案中新增以下程式碼。

<!DOCTYPE html>
<html>
<head>
   <title> Basic form </title>
</head>
<body>
   <h1>Create a new user</h1>
   <form method="post">
      {% csrf_token %}
      {{ form.as_p }}
      <input type="submit" value="Create">
   </form>
</body>
</html>

上面的程式碼將在網頁上顯示錶單。

  • 步驟14 − 作為最後一步,您需要透過在包含manage.py檔案的專案目錄中執行以下命令來執行專案。

python manage.py runserver

輸出

當用戶開啟localhost時,將看到以下網頁。

在表單中輸入您的姓名和電子郵件並按下建立按鈕後,它將呼叫views.py檔案的create_user()函式,並將資料儲存到資料庫中。將資料儲存到資料庫後,訊號將呼叫user_created()函式,該函式在控制檯中列印姓名和電子郵件,如下所示。

結論

我們學習瞭如何使用訊號在發生任何事件時觸發特定操作。在即時開發中,我們可以使用訊號來呼叫傳送確認電子郵件給使用者的函式,每當建立新使用者時。此外,django訊號還有許多其他用例。

更新於:2023年5月11日

4K+ 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.