我需要向用户显示他拥有的对象。由于我需要在超过80%的观看次数上执行此操作,因此硬编码会导致DRY死亡。更重要的是,用户永远不会看到其他人拥有的记录。手工完成(在所有视图中)似乎也容易出错。
我一直在寻找装饰器(如login_required),但这似乎在请求处理过程的早期。是否可以将request.user值获取到自定义编写的管理器中并执行以下操作:
class CustomerManager(models.Manager):
def get_query_set(self):
return super(CustomerManager, self).get_query_set().filter(created_by=request.user)
或者经理对象就像'不去!'就请求信息而言,作为模型定义?
Thanx很多。
这是保存对象的一部分,但纯粹是精心设计,而不是必要的阅读。
保存部分相对安全。我更改了模型上的object.save()函数,因此它将userid作为参数。
def save(self, userid):
self.created_by = userid
super(Customer, self).save(userid)
在视图中:
if form.is_valid():
customer = form.save(commit=False)
customer.save(request.user)
这样我就不需要在customer.save...
customer.created_by = request.user
因此减少了错误。
答案 0 :(得分:5)
为什么不在 CustomerManager 中定义一个为用户提取记录的方法:
class CustomerManager(models.Manager):
def get_user_records(self, user):
return self.filter(created_by=user)
我会让get_query_set
无法重复,因为我觉得在你的情况下无法覆盖它。
答案 1 :(得分:0)
我认为最好的地方可能在你的观点中 - 虽然我可能是错的。在self.created_by = userid
方法中添加save()
无法保护人们免于查看信息。只是保存它。
如果您使用自定义管理器作为默认查询集,则20%的观看次数将会失败。
我认为您需要一个视图 - 为什么不创建一次自己的通用视图然后重复使用它?
def object_detail_user_only(request. queryset, **kwargs):
queryset = queryset.filter(created_by=request.user)
return list_detail.object_detail(request,queryset,**kwargs)
那样的东西(未经测试)?