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

在Django同一视图处理多模型对象时,如何传递对象ID

解决Django中通过复选框更新Reminder状态的问题

核心问题分析

当前实现依赖note字段查询Reminder,存在重复数据导致的更新错误风险,且未传递唯一标识的id;同时JavaScript会提交页面所有表单,而非当前点击的目标表单。以下是针对性修复方案:


步骤1:修改HTML表单,传递Reminder唯一ID

在每个提醒的表单中添加隐藏字段传递id,同时调整JavaScript仅提交当前表单:

<div id="tabs" style="overflow-y:scroll; height:14rem;"> 
    {% if reminders %}
        {% for reminder in reminders %}
        <div class="d-flex align-items-center p-0 my-1">
            <form action="" method="POST">
                {% csrf_token %}
                <!-- 添加隐藏字段传递Reminder的唯一ID -->
                <input type="hidden" name="reminder_id" value="{{ reminder.id }}">
                <div class="form-check">
                    <input class="form-check-input remdone" type="checkbox" value="False">
                    <input class="form-check-label" style="border: 0px; background-color: white; color: black;" 
                           value="{{reminder.note}}" disabled>
                </div>
            </form>
        </div>
        {% endfor %}
    {% else %}
    <h5 class="text-center mt-5">You did a good job! No reminders left!</h5>    
    {% endif %}
</div>

<!-- 将JS移出循环,避免重复渲染 -->
<script type='text/javascript'>
$(document).ready(function() { 
    $('.remdone').change(function(){
        // 仅提交当前复选框所属的表单
        $(this).closest('form').submit();
    });
});
</script>

步骤2:更新视图逻辑,安全修改Reminder状态

修改views.py的POST处理逻辑,通过id精准定位对象,并验证权限避免越权操作:

@login_required
def index(request):
    current_user = request.user
    person = Person.objects.get(user=current_user)
    # 仅显示未关闭的提醒,更新后自动从列表消失
    reminders = Reminders.objects.filter(user_id=person.id, status__ne="Closed").order_by("-date")
    scheduled_calls = ScheduledCalls.objects.filter(user_id=person.id).order_by("-date")
    notes = Notes.objects.filter(user_id=person.id).order_by("-date")
    links = SavedLinks.objects.filter(user_id = person.id)

    if request.method == "POST":
        # 优先处理Reminder更新请求
        if 'reminder_id' in request.POST:
            reminder_id = request.POST.get('reminder_id')
            # 仅允许用户修改自己的提醒
            Reminders.objects.filter(id=reminder_id, user_id=person.id).update(status="Closed")
            return redirect("home")
        
        # 以下保留原有其他表单的处理逻辑
        call_form = _get_form(request, CallForm, "call_form_pre")
        link_form = _get_form(request, LinkForm, "link_form_pre")
        note_form = _get_form(request, NotesForm, "note_form_pre")
        reminder_form = _get_form(request, RemindersForm, "reminder_form_pre")

        if call_form.is_bound and call_form.is_valid():
            call_form.instance.user_id = person
            call_form.save()
            return redirect("home")

        if link_form.is_bound and link_form.is_valid():
            link_form.instance.user_id = person
            link_form.save()
            return redirect("home")
        
        if note_form.is_bound and note_form.is_valid():
            note_form.instance.user_id = person
            note_form.save()
            return redirect("home")
        
        if reminder_form.is_bound and reminder_form.is_valid():
            reminder_form.instance.user_id = person
            reminder_form.save()
            return redirect("home")
        
    return render(request, "main/home.html", {
        "person" : person, 
        "scheduled_calls" : scheduled_calls, 
        "reminders" : reminders, 
        "notes" : notes,
        "links" : links, 
        "call_form" : CallForm(prefix = "call_form_pre"),
        "link_form" : LinkForm(prefix = "link_form_pre"),
        "note_form" : NotesForm(prefix = "note_form_pre"),
        "reminder_form" : RemindersForm(prefix = "reminder_form_pre"),
    })

步骤3:移除无用表单实例(可选)

视图中remindercheck_form未实际使用,可以直接删除该表单的实例化代码,简化逻辑。


关键优化说明

  1. 精准定位:用Reminder的id作为查询条件,彻底避免note重复导致的错误更新
  2. 权限控制:更新时加入user_id=person.id过滤,防止用户修改不属于自己的提醒
  3. 前端逻辑:JavaScript仅提交当前目标表单,避免批量提交的异常
  4. 自动隐藏:查询提醒时排除已关闭项,实现更新后自动从列表消失的需求

内容的提问来源于stack exchange,提问作者Satten

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:43:18