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

