2017-09-30 4 views
0

これは一般的な要件である必要がありますが、SOまたはDjangoのドキュメントでは私のためには何も見つかりませんでした。私は本当にDjangoを初めて使っています。私の問題:私はエリアの所有権を持つ会社に応じてフォームのドロップダウンリストに表示されるエリアのリストを変更する必要があります。所有権に基づいて変更/フィルタのドロップダウンリスト

私のアプリでは: アカウント(つまりユーザー)は会社のメンバーです。会社がエリアを管理している。エリア内にはいくつかのルートがあります。経路は追加/更新/削除するか、または当社が別のエリアに割り当てることができます。

私のフォームでは、会社に所属するエリアのみがドロップダウンリストに表示されていることを確認したいと思います。本質的に、ユーザはエリアを選択し、次にエリアに関連するCRUDルートを選択する。 forms.py

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

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) 

追加:

 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) 

が、真ん中の権利を取得することはできません。私も のinitを(作成/ 'ユーザに渡すことが、TypeError例外では結果のみアカウント/設定/ルート/で試してみた)1つの必要な位置引数不足している:あなたは、一般的な使用している場合は「ユーザー」

答えて

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 
関連する問題