如何在 Django 中创建和使用信号?

pythondjangoserver side programmingprogramming

Django 是一个 Python Web 框架,开发人员用它来更快地开发 Web 应用程序并写下简单的代码语法。此外,Django 是一个功能丰富的应用程序,因为它包含许多功能,包括 Django 信号。

在 Django 中,信号用于在发生任何事件时触发某些功能。例如,当用户在数据库中进行某些更改时,我们可以触发特定函数,该函数可以在网页上向用户显示更改。

Django 总共包含 3 种类型的信号,我们在下面进行了解释。

  • Pre_save/post_save − 每当用户在数据库中保存任何对象时,它都会触发操作。

  • Pre_delete/post_delete − 每当用户想要从数据库中删除对象时,它都会自动触发。

  • Pre_init/post_init − 每当在数据库中创建新模型时,它都会被触发。

在本教程中,我们将学习在 Django 中使用信号。在这里,我们将从头开始创建一个应用程序,并添加代码来创建信号。

用户应按照以下步骤在 Django 应用程序中创建信号。

  • 步骤 1 - 首先,如果尚未安装 Django,请在终端中运行以下命令,在本地计算机上安装 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),
    # 这里,firstApp 是应用程序名称
    path('', include("firstApp.urls")),
]

在上面的代码中,我们包含了"firstApp"的 URL。

  • 第 6 步 - 现在,我们需要在 django_demo 文件夹的 settings.py 文件中添加"firstApp"。打开 settings.py 文件,并用以下代码替换当前代码。

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

在上面的代码中,我们在 INSALLED_APPS 数组中添加了"firstApp"。

  • 步骤 7 - 现在,我们将创建一个模型来将用户的数据保存在数据库中。打开'firstApp'目录中的models.py文件,并将以下代码添加到其中。

from django.db import models

class User(models.Model):
    # 添加名称
    name = models.CharField(max_length=100)
    # 添加电子邮件
    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)

在上面的代码中,我们将"post_save"信号与"User"模型结合使用。因此,每当数据库中保存新用户时,它都会调用 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 request.method == 'POST':
        form = UserForm(request.POST)
        if form.is_valid():
            form.save()
        else:
            form = UserForm()
# 在响应中发送 base.html 文件。
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

输出

用户打开本地主机时将看到以下网页。

在表单中输入您的姓名和电子邮件并按下创建按钮后,它将调用 views.py 文件的 create_user() 函数,将数据保存在数据库中。在数据库中保存数据后,信号将调用 user_created() 函数,该函数在控制台中打印名称和电子邮件,如下所示。

结论

我们了解了如何使用信号在任何事件触发时触发特定操作。在实时开发中,我们可以使用信号调用在创建新用户时向用户发送确认电子邮件的函数。此外,django 信号还有许多其他用例。


相关文章