1

假设我有一个运行库存系统的人。每个人都有一些汽车,每辆汽车都有大量的零件(假设是数千个)。

一个人,鲍勃,使用 Django 表单来创建汽车。现在,Bob 去创建一些零件。只有在表单级别,Django 才知道 Parts 属于某个特定的 Car,并且 Parts.ForeignKey(Car) 字段应该只有特定的 Car 作为选项。创建零件时,您必须弄乱表单的构造函数或类似的东西,以便将 Cars 的选择限制为仅 Bob 拥有的汽车。

在表单级别强制执行这种所有权似乎根本不合适或不安全。首先,除了车主之外,任何人似乎都无法访问其他用户的汽车;目前,只有实体形式的编程才能防止任何人查看任何其他人的汽车!其次,以这种方式修改构造函数来解决问题似乎很草率。大家对此怎么看,有什么办法可以强制执行吗?

4

1 回答 1

1

首先,这部分应该发生在您知道谁是当前用户的级别上。在 Django 中,没有什么比全局 request.user 更好的了,所以你需要检查你有请求对象的地方,或者将它作为参数传递。

实现您要求的一种方法是使用自定义管理器。对于 Car 类,您可以使用

class CarManager(models.Manager):
    def for_user(self, user):
        return super(CarManager, self).get_query_set().filter(creator=user)

您可能还想覆盖默认管理器,它的默认方法只允许此方法。

对于第二部分,您不需要修改构造函数,如果您不喜欢它还有其他方法。但是修改它们可以向您保证,例如,您无法在没有登录用户的情况下创建表单。另一种方法是使用ModelChoiceField并在视图中覆盖它的查询集属性:

form.car.queryset = Car.objects.for_user(request.user)

但这种方法容易出错。您应该像这样修改表单构造函数:

class PartForm(forms.ModelForm):
    def __init__(self,user,*args,**kwargs):
        super (PartForm,self ).__init__(*args,**kwargs)
        self.fields['car'].queryset = Car.objects.for_user(user)

希望这可以帮助。

于 2010-05-04T12:44:52.073 回答