Django开发如何将Location表记录与指定用户关联避免所有用户可见
解决方案
你需要分别修改模型层、视图层代码,一共3个核心修改点:
1. 修改Location模型,新增用户关联字段
首先给地址表加外键关联Django自带的User表,实现地址和用户的绑定:
class Location(models.Model): # 新增字段,关联对应用户 user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="locations", null=True) city = models.CharField(max_length=50, choices=cy.city, blank=True) street = models.CharField(max_length=100, blank=True) home_number = models.CharField(max_length=100, blank=True) def __str__(self): # 顺便修正你原来重复写city的问题 return f"{self.city} {self.street} {self.home_number}"
修改完后执行数据库迁移命令:python manage.py makemigrationspython manage.py migrate
2. 修正添加地址视图的保存逻辑
你原来的form_valid逻辑完全错误,应该给新增的Location实例的user字段赋值当前登录用户,同时添加登录限制避免匿名用户报错:
from django.contrib.auth.mixins import LoginRequiredMixin class AddLocationView(LoginRequiredMixin, CreateView): model = Location form_class = AddLocationForm template_name ='add_location.html' success_url = reverse_lazy("add-item") def form_valid(self, form): # 给地址绑定当前登录用户 form.instance.user = self.request.user return super().form_valid(form)
3. 修改添加商品视图,过滤仅显示当前用户的地址
重写表单获取逻辑,把地址下拉框的可选范围限制为当前用户自己添加的地址:
from django.contrib.auth.mixins import LoginRequiredMixin class AddItemView(LoginRequiredMixin, CreateView): model = Add_Item form_class = AddItemForm template_name ='add_item.html' def get_form(self, form_class=None): form = super().get_form(form_class) # 过滤地址选项,仅显示当前用户的地址 form.fields['location'].queryset = Location.objects.filter(user=self.request.user) return form # 补充商品绑定当前用户的逻辑,你原来的代码未实现该逻辑 def form_valid(self, form): form.instance.user = self.request.user return super().form_valid(form)
修改完成后即可实现:用户新增的地址仅和自己绑定,添加商品时只能看到自己保存的地址。
内容的提问来源于stack exchange,提问作者user16375265
相关产品推荐
相关产品推荐

