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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:58:06