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

Django费用追踪应用多用户数据共享问题求助

解决方案

1. 限制费用表单,自动关联当前用户

修改FinanceForm,移除customer字段,避免用户手动选择关联用户:

class FinanceForm(ModelForm):
    class Meta:
        model = Finance
        fields = ['category', 'price', 'month']  # 仅保留需要用户输入的字段

2. 修复首页视图,过滤并绑定当前用户记录

修改homeView,只查询当前登录用户的费用记录,且新增记录时自动绑定到当前用户:

@login_required(login_url='login')
def homeView(request):
    # 仅查询当前用户的费用条目
    items = Finance.objects.filter(customer=request.user)
    form = FinanceForm()
    
    if request.method == 'POST':
        form = FinanceForm(request.POST)
        if form.is_valid():
            # 临时保存表单,手动绑定当前用户后再提交
            finance_entry = form.save(commit=False)
            finance_entry.customer = request.user
            finance_entry.save()
            return HttpResponseRedirect('/')
    
    return render(request, 'app_finance/home.html', {'form': form,'items':items})

3. 完善注册逻辑,自动创建用户关联的Customer实例

当前注册流程未创建Customer实例,会导致request.user.customer抛出异常,修改registerPage视图:

@csrf_exempt
def registerPage(request):
    if request.user.is_authenticated:
        return redirect('home')
    else:
        form = CreateUserForm() 
        if request.method == 'POST':
            form = CreateUserForm(request.POST)
            if form.is_valid():
                user = form.save()
                username = form.cleaned_data.get('username')
                
                group = Group.objects.get(name='customer')
                user.groups.add(group)

                # 自动创建关联的Customer记录
                Customer.objects.create(
                    user=user,
                    name=username,
                    email=form.cleaned_data.get('email')
                )

                messages.success(request, 'Account was created for '+ username)
                return redirect('login')

        context = {'form':form}
        return render(request, 'app_finance/register.html', context)

4. 完善Customer模型的字符串显示

取消注释并修正Customer模型的__str__方法,方便后台管理识别:

class Customer(models.Model):
    user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=200, null=True)
    email = models.CharField(max_length=200, null=True,blank=True)
    date_created = models.DateTimeField(auto_now_add=True, null=True)

    def __str__(self):
        # 优先显示自定义名称,为空则显示用户名
        return self.name if self.name else self.user.username

可选优化:修正Finance模型外键命名(需迁移数据库)

当前Finance模型中customer字段实际关联User模型,命名易混淆,可修改为user:

class Finance(models.Model):
    # ... 其他代码不变
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True,blank=True)
    # ... 其他代码不变

修改后需同步更新视图(items = Finance.objects.filter(user=request.user))和模板({{i.user}}),并执行数据库迁移。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:55:40