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
相关产品推荐
相关产品推荐

