如何通过HTML按钮调用Django的view.py函数实现数据库CRUD操作
Django 数据库CRUD操作实现方案
一、先修正模板中的语法与结构问题
原模板存在标签错误(比如fieldset属性写法、表单闭合混乱),调整为符合规范的结构:
{% extends 'home/base.html' %} {% load crispy_forms_tags %} {% block content %} <!-- 主表单:处理新增、更新 --> <form method="POST" action="{% url 'twitter' %}" enctype="multipart/form-data"> {% csrf_token %} <fieldset class="form-group"> <legend class="border-bottom mb-4">Twitter Information</legend> {{ tw|crispy }} <!-- 如果是更新场景,需要隐藏传递数据主键 --> {% if tw.instance.pk %} <input type="hidden" name="twitter_id" value="{{ tw.instance.pk }}"> {% endif %} </fieldset> <div class="form-group"> <button class="btn btn-outline-info" type="submit" name="action" value="create">Submit</button> <button class="btn btn-info" type="submit" name="action" value="update">Update</button> <button class="btn btn-dark" type="reset">Reset</button> </div> </form> <!-- 删除操作单独表单:用POST请求保证安全 --> <form method="POST" action="{% url 'twitter_container.twitter-edit' tw.instance.pk %}" style="display: inline;"> {% csrf_token %} <button class="btn btn-danger" type="submit">Delete</button> </form> {% endblock content %}
二、视图层(view.py)实现CRUD逻辑
假设你的数据模型为Twitter,表单类为TwitterForm,编写对应视图:
from django.shortcuts import render, redirect, get_object_or_404 from .models import Twitter from .forms import TwitterForm # 处理新增、更新操作的视图 def twitter(request): # 更新场景:通过主键获取目标实例 twitter_id = request.POST.get('twitter_id') instance = get_object_or_404(Twitter, pk=twitter_id) if twitter_id else None if request.method == 'POST': action = request.POST.get('action') form = TwitterForm(request.POST, request.FILES, instance=instance) if form.is_valid(): if action == 'create': # 新增数据 form.save() elif action == 'update': # 更新数据 form.save() return redirect('twitter') # 操作完成后重定向到目标页面 else: # GET请求:渲染表单(更新场景自动填充数据) form = TwitterForm(instance=instance) return render(request, '你的模板路径.html', {'tw': form}) # 处理删除操作的视图(对应twitter_container.twitter-edit) def twitter_edit(request, pk): instance = get_object_or_404(Twitter, pk=pk) if request.method == 'POST': instance.delete() return redirect('twitter') # 如果需要删除确认页,可在此处渲染确认模板 return redirect('twitter')
三、URL配置(urls.py)
确保视图与URL正确映射:
from django.urls import path from . import views app_name = 'twitter_container' urlpatterns = [ path('twitter/', views.twitter, name='twitter'), path('twitter/<int:pk>/edit/', views.twitter_edit, name='twitter-edit'), ]
四、核心注意事项
- 操作区分:通过给按钮添加
name="action"和不同value,让视图判断执行哪种CRUD操作。 - 删除安全性:禁止用GET请求执行删除(原模板的
<a>标签为GET请求),必须用POST请求避免误操作与CSRF风险。 - 实例定位:更新、删除操作必须通过主键获取对应数据库实例,确保操作目标正确。
内容的提问来源于stack exchange,提问作者anaconda1337
相关产品推荐
相关产品推荐

