如何在Django中通过按钮自动更新Model的active字段?
在Django中实现点击按钮自动更新
active字段的方案 我来帮你搞定这个需求,其实步骤很清晰,咱们一步步来:
1. 修复模板中的表单
首先你的表单缺少Django必需的CSRF令牌(否则会触发403权限错误),而且最好明确指定提交的目标URL。修改后的模板代码如下:
<form action="{% url 'development_detail' object.pk %}" method="POST"> {% csrf_token %} <input type="submit" name="archive" class="btn btn-primary pull-right" value="Archive" /> </form>
这里development_detail是你详情页的URL名称,记得替换成你自己项目里的实际名称。如果表单就在详情页上,也可以把action留空,默认会提交到当前页面。
2. 处理视图逻辑
有两种常见的实现方式,你可以根据自己当前用的视图类型选择:
方式一:在详情类视图中处理POST请求
如果你用的是Django的DetailView(基于类的视图),直接重写post方法即可:
# views.py from django.views.generic.detail import DetailView from .models import Development class DevelopmentDetailView(DetailView): model = Development template_name = '你的模板路径.html' # 替换成实际模板路径 def post(self, request, *args, **kwargs): # 获取当前的Development对象 self.object = self.get_object() # 将active字段设为False self.object.active = False self.object.save() # 重定向回详情页(也可以添加成功提示后再返回) return self.get(request, *args, **kwargs)
方式二:用单独的函数视图处理归档操作
这种方式更符合单一职责原则,把归档逻辑和详情展示分开:
# views.py from django.shortcuts import get_object_or_404, redirect from .models import Development from django.views.decorators.http import require_POST @require_POST # 只允许POST请求访问 def archive_development(request, pk): # 获取要归档的对象 dev = get_object_or_404(Development, pk=pk) # 更新active字段 dev.active = False dev.save() # 重定向回详情页 return redirect('development_detail', pk=pk)
然后在urls.py中添加对应的路由:
# urls.py from django.urls import path from .views import DevelopmentDetailView, archive_development urlpatterns = [ path('development/<int:pk>/', DevelopmentDetailView.as_view(), name='development_detail'), path('development/<int:pk>/archive/', archive_development, name='archive_development'), ]
这种情况下,模板里的表单action要改成:
action="{% url 'archive_development' object.pk %}"
3. 验证效果
完成后,点击"Archive"按钮,active字段就会被自动更新为False,页面会重定向回详情页。你可以在后台管理页面查看该对象的active状态,确认是否修改成功。
内容的提问来源于stack exchange,提问作者OnionSandwich
相关产品推荐
相关产品推荐

