根据所有权

时间:2017-09-30 21:11:05

标签: django django-forms

这必须是一个常见的要求,但我在SO或Django文档中找不到任何对我有用的东西。我是Django的新手。我的问题:我需要根据拥有区域所有权的公司更改表单下拉列表中显示的区域列表。

在我的应用中: 账户(即用户)是公司的成员。公司管理区域。区域内有许多路线。路线可以由公司添加/更新/删除或分配到不同的区域。

因此,在我的表单上,我想确保只有属于公司的区域才会显示在下拉列表中。本质上,用户将选择区域,然后选择与区域相关联的CRUD路线。

class Company(models.Model):
     name = models.CharField(...
     account_number = models.CharField(...
     ...


class Account(models.Model):
    name = models.OneToOneField(User...
    company = models.ForeignKey(Company)
    ...

class Area(models.Model):
    owner = models.ForeignKey(Company)
    number = modes.PositiveIntegerField(...

class Route(models.Model):
    owner = models.ForeignKey(Company)
    area = models.ForeignKey(Area)

在forms.py

class RouteCreateForm(forms.ModelForm):
    class Meta:
        model= Route
        fields= [
            'area',
            'route_number',
            ...
        ]

添加:

     self.fields['area'].queryset = Area.objects.filter(owner_id = 2)

提供正确的过滤但当然不是动态的。

我有很多变化:

def __init__(self, *args, **kwargs):
    ??how to pass in user to ultimately get to owner_id??
    self.fields['area'].queryset = Area.objects.filter(owner_id = owner_id)

但不能得到中间的权利。我也尝试传入'user',但唯一的结果是/ account / setup / route / create中的TypeError init ()缺少1个必需的位置参数:'user'

1 个答案:

答案 0 :(得分:1)

如果您使用的是通用CreateView,则可以通过覆盖视图中的get_form()来修改每个请求的表单。这看起来像这样:

class RouteCreateView(generic.CreateView):
    form_class = RouteCreateForm

    def get_form(self):
       form = super(RouteCreateView, self).get_form()
       form.fields['area'].queryset = Area.objects.filter(owner=self.request.user)
       return form