You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:50:43