📜  Django – 如何在单个表单中添加多个提交按钮?

📅  最后修改于: 2022-05-13 01:55:27.007000             🧑  作者: Mango

Django – 如何在单个表单中添加多个提交按钮?

先决条件:

  • Python
  • 姜戈

当我们使用 HTML 表单提交数据时,它会通过 action 属性中定义的特定 URL 将数据发送到服务器。要使用单个 HTML 表单执行不同的操作,我们只需要在表单中添加多个提交按钮。例如,如果您浏览时事通讯应用程序的代码,您会在一个 HTML 表单中找到订阅和取消订阅按钮,但它们都执行不同的操作。

在本教程中,我们将使用 Django 制作一个时事通讯应用程序。我们将在单个 HTML 表单中添加订阅和取消订阅按钮。此外,我们会根据用户点击订阅或取消订阅按钮,在我们的数据库中添加或删除用户的电子邮件地址。

要创建简单的时事通讯 Django 应用程序,请按照以下步骤操作。

创建一个新的 Django 项目

要开始一个新的 Django 项目,您的本地计算机应该满足上面给出的先决条件。用户可以使用以下命令来启动一个新项目。

django-admin startproject newslatter

接下来,转到项目目录。

cd newslatter

启动时事通讯应用

要在时事通讯项目中启动新应用,请在项目目录中运行以下命令。

django-admin startapp appnewslatter

现在,在 newsletter 项目的 settings.py 中的 installed_apps 部分中添加“appnewslatter”。

path: newslatter/settings.py

接下来,编辑 newsletter 文件夹中的urls.py并添加以下代码。  

Path: newslatter/urls.py

文件名:urls.py

Python3
from django.contrib import admin
from django.urls import path, include
 
urlpatterns = [
    path('admin/', admin.site.urls),
   
    #including URLS of appnewslatter app
    path("", include('appnewslatter.urls')),
]


Python3
from django.urls import path
from . import views
 
urlpatterns = [
    
    # URL to open home page
    path("", views.home, name='home'),
]


HTML


   
  
    NewsLatter
  
   
  
   
  
  {% if messages %}
    
            {% for message in messages %}                            {{ message }}         {% endfor %}     
   {% endif %}              
                  

               
      


Python3
from django.db import models
 
# creating database model to store email
class newslatteremail(models.Model):
    userEmail = models.EmailField(max_length=254)
 
    def __str__(self):
        return self.userEmail


Python3
from django.contrib import admin
from .models import newslatteremail
 
# registering the model
admin.site.register(newslatteremail)


Python3
from django.shortcuts import render
from django.contrib import messages
from .models import newslatteremail
 
def home(request):
     
    # if post request comes from the subscribe button
    # then saving user email in our database
    if 'subscribe' in request.POST:
        email = newslatteremail()
        email.userEmail = request.POST.get("email")
        email.save()
        messages.info(
            request, 'You have successfully subscribed to our newslatter.')
     
    # if post request comes from the unsubscribe button
    # then deleting the user email from our database
    if 'unsubscribe' in request.POST:
        newslatteremail.objects.get(
            userEmail=request.POST.get("email")).delete()
        messages.info(request, 'sorry to see you!!!')
         
    return render(request, 'news.html')


在“appnewslatter”文件夹中创建一个新的 urls.py 文件。现在,您的项目目录应如下图所示。

编辑 appnewslatter 文件夹中的 urls.py。我们正在添加主页的 URL。

Path: appnewslattere/urls.py

文件名:urls.py

Python3

from django.urls import path
from . import views
 
urlpatterns = [
    
    # URL to open home page
    path("", views.home, name='home'),
]

在 appnewslatter 文件夹中创建一个“templates”文件夹来存储 HTML 模板。

path: appnewslatter/templates

在模板文件夹中创建一个 news.html 文件,为我们的时事通讯应用添加一个表单。

Path: appnewslatter/templates/news.html

在 news.html 文件中添加以下代码,该文件包含一个带有 2 个提交按钮的表单。每个提交按钮都有一个唯一的名称。在 views.py 文件中,我们将使用按钮的名称识别用户从哪个按钮发送了发布请求。

文件名:news.html

HTML



   
  
    NewsLatter
  
   
  
   
  
  {% if messages %}
    
            {% for message in messages %}                            {{ message }}         {% endfor %}     
   {% endif %}              
                  

               
      

现在,我们需要在数据库中创建一个表来存储用户的电子邮件。我们将编辑 models.py 文件

path: appnewlatter/models.py

文件名:models.py

Python3

from django.db import models
 
# creating database model to store email
class newslatteremail(models.Model):
    userEmail = models.EmailField(max_length=254)
 
    def __str__(self):
        return self.userEmail

在 admin.py 文件中注册创建的模型。

Path: appnewslatter/admin.py

文件名:admin.py

Python3

from django.contrib import admin
from .models import newslatteremail
 
# registering the model
admin.site.register(newslatteremail)

注册模型后,我们需要迁移它。用户需要一一运行以下 2 个命令。

python manage.py makemigrations
python manage.py migrate

现在,我们将编辑 views.py 文件并添加代码来处理来自订阅和取消订阅按钮的请求。在这里,我们借助按钮的 name 属性检查我们从哪个提交按钮获取发布请求。

句法:

if 'name_of_button' in request.POST:
   # perform some action

例子:

if 'subscribe' in request.POST:
   # add the user email in database
if 'unsubscribe' in request.POST:
   # remove the user email from database

将以下代码复制/粘贴到 views.py 文件中。

Path: appnewslatter/views.py

文件名:views.py

Python3

from django.shortcuts import render
from django.contrib import messages
from .models import newslatteremail
 
def home(request):
     
    # if post request comes from the subscribe button
    # then saving user email in our database
    if 'subscribe' in request.POST:
        email = newslatteremail()
        email.userEmail = request.POST.get("email")
        email.save()
        messages.info(
            request, 'You have successfully subscribed to our newslatter.')
     
    # if post request comes from the unsubscribe button
    # then deleting the user email from our database
    if 'unsubscribe' in request.POST:
        newslatteremail.objects.get(
            userEmail=request.POST.get("email")).delete()
        messages.info(request, 'sorry to see you!!!')
         
    return render(request, 'news.html')

最后,我们创建了一个简单的时事通讯应用程序,并了解了如何在单个 HTML 表单中添加多个提交按钮。让我们运行项目并查看输出。用户可以使用以下命令运行 Django 应用程序。

Python manage.py runserver

输出: