Django 3.1:如何在类视图中通过按钮点击更新模型字段值?
更优的Django类视图实现方案
当然有!Django的类视图(CBV)相比函数视图(FBV)更具复用性,还能利用框架内置的功能(比如权限校验、标准化流程等),针对你设置最佳答案的需求,这里提供两种靠谱的实现方式,还顺便优化了原方案的安全问题:
方式一:使用UpdateView(最简洁)
UpdateView是Django专门为单模型实例更新场景设计的类视图,刚好匹配我们只修改is_best_answer字段的需求:
1. 编写类视图
from django.views.generic.edit import UpdateView from django.urls import reverse_lazy from .models import Answer class SetBestAnswerView(UpdateView): model = Answer fields = ['is_best_answer'] # 替换成你实际需要跳转的页面,比如问题详情页更合理 success_url = reverse_lazy('home') def form_valid(self, form): # 强制将字段设为True,无需用户输入 form.instance.is_best_answer = True return super().form_valid(form)
2. 配置URL
path('answer/<int:pk>/best-answer/', SetBestAnswerView.as_view(), name='select'),
3. 优化模板(改用POST请求,更安全)
原方案用GET请求修改数据存在安全风险(比如被爬虫误触发),建议改成POST表单:
<form method="post" action="{% url 'select' answer.id %}"> {% csrf_token %} <button type="submit" class="btn btn-outline-dark">Set Best Answer</button> </form>
方式二:自定义View子类(更灵活)
如果需要添加自定义逻辑(比如仅允许提问者设置最佳答案),可以直接继承基础View类:
1. 编写类视图
from django.views import View from django.shortcuts import get_object_or_404, redirect from .models import Answer class SetBestAnswerView(View): def post(self, request, pk): answer = get_object_or_404(Answer, pk=pk) # 可选:添加权限校验,仅允许问题作者操作 # if answer.question.author != request.user: # return redirect('question-detail', pk=answer.question.pk) answer.set_best_answer() # 跳回对应问题详情页,用户体验更好 return redirect('question-detail', pk=answer.question.pk)
2. 配置URL
和方式一的URL配置完全一致:
path('answer/<int:pk>/best-answer/', SetBestAnswerView.as_view(), name='select'),
3. 模板代码
同样使用方式一中的POST表单即可。
额外优化提示
- 权限控制:一定要加上权限校验,避免任意用户修改最佳答案状态,比如判断当前用户是否是对应问题的作者。
- 跳转逻辑:原方案跳转到根路径
/的体验不好,建议跳回对应的问题详情页,让用户能立刻看到修改后的效果。
内容的提问来源于stack exchange,提问作者spotnag
相关产品推荐
相关产品推荐

