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 %}
{% endif %}
{% endfor %}
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 %}
{% endif %}
{% endfor %}
现在,我们需要在数据库中创建一个表来存储用户的电子邮件。我们将编辑 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
输出: