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

Django Formset问题:如何仅获取当前用户的数据库数据?

解决方案

1. 过滤Formset数据范围,仅加载当前用户记录

不管是GET请求初始化表单,还是POST请求处理提交,都需要指定Formset的queryset为当前用户的SocialURL数据,避免加载所有用户的记录。

2. 修正保存逻辑,确保新记录关联当前用户

原代码中直接给formset设置user_id的方式错误,需要遍历每个表单实例,逐个绑定当前用户后再保存。

修改后的完整views.py代码

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.forms import modelformset_factory
from .models import SocialURL

@login_required
def my_formset_view(request):
    formset_class = modelformset_factory(
        model=SocialURL, fields=('platform', 'link'), extra=0, can_delete=True
    )
    # 过滤当前用户的社交链接数据
    user_social_links = SocialURL.objects.filter(user=request.user)
    
    if request.method == 'POST':
        # POST请求必须传入当前用户的queryset,确保只处理自己的记录
        formset = formset_class(data=request.POST, queryset=user_social_links)
        if formset.is_valid():
            # 暂存未保存的实例,逐个绑定用户
            instances = formset.save(commit=False)
            for instance in instances:
                instance.user = request.user
                instance.save()
            # 处理多对多关系(如果有)及删除标记
            formset.save_m2m()
            return redirect(to='profiles:home')
    else:
        # GET请求加载当前用户的已有链接
        formset = formset_class(queryset=user_social_links)
    
    return render(request, 'profiles/social_form.html', {'formset': formset})

关键说明

  • QuerySet过滤:通过SocialURL.objects.filter(user=request.user)限定Formset仅加载当前用户的社交链接,彻底避免显示其他用户的数据。
  • 实例绑定用户:遍历formset.save(commit=False)返回的实例,逐个设置user=request.user,确保新增或修改的记录都属于当前用户。
  • POST必传queryset:如果POST请求时不传入当前用户的queryset,Formset会默认匹配所有数据库记录,导致误修改其他用户的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:48:34