2016-05-23 16 views
1

私は特定のカテゴリまたはサブカテゴリにファイルをアップロードできるこのアプリケーションを持っています。それはうまく動作しますが、問題は私が特定のユーザーと特定の親カテゴリに対してのみ選択値を表示しようとしているときに、データベースに格納されているすべての値を表示しているときです。Django形式の外部キーを使用して選択値をフィルタリングする方法

views.py

class AddDocumentView(LoginRequiredMixin, SuccessMessageMixin, CreateView): 
    login_url = reverse_lazy('users:login') 
    form_class = FileUploadForm 
    template_name = 'docman/forms/add-document.html' 
    success_url = reverse_lazy('docman:index') 
    success_message = 'Document was successfully added' 

    def form_valid(self, form): 
     profile = form.save(commit=False) 
     profile.user = self.request.user 
     return super(AddDocumentView, self).form_valid(form) 

forms.py

class FileUploadForm(forms.ModelForm): 
    file = forms.FileField() 

    class Meta: 
     model = Document 
     exclude = ('user',) 
     fields = [ 
      'file', 
      'slug', 
      'category', 
     ] 

    def __init__(self, user=None, **kwargs): 
     super(FileUploadForm, self).__init__(**kwargs) 
     if user: 
      self.fields['category'].queryset = Category.objects.filter(user_id=user.id, parent_id=None) 

私は、私もこれまでのところ得た方法で同様の質問に対する解決策を試してみたが、それはまだによるフィルタリングいませんユーザーと私はそれを親のIDでフィルタリングする方法を理解できません。私は間違って何をしているか、任意のアイデアですか?何か助けていただければ幸いです。必要に応じてより多くの情報を提供することができます。

-----------------ソリューションUPDATE -----------------

おかげで私@solarissmokeフォームにユーザー情報を取得できました。それから私はkwargsを使ってURLからparent_idを取得するために同じことをしました。

views.py

# Override the view's get_form_kwargs method to pass the user and/or pk to the form: 
def get_form_kwargs(self): 
    pk = self.kwargs['pk'] 
    kwargs = super(AddDocumentView, self).get_form_kwargs() 
    kwargs['user'] = self.request.user 
    # Check if category exists with pk, otherwise none 
    if Category.objects.filter(parent_id=pk): 
     kwargs['pk'] = pk 
    else: 
     kwargs['pk'] = None 
    return kwargs 

それから私はあなたのフォームがuser引数を期待しているのinit

forms.py

def __init__(self, user=None, pk=None, **kwargs): 
    super(FileUploadForm, self).__init__(**kwargs) 
    if user: 
     self.fields['category'].queryset = Category.objects.filter(user=user, parent_id=pk) 

答えて

1

に余分agument(PK)を追加しましたが、あなたは1つを供給していないので、userは常にNoneです。フォームにユーザーを渡すために、ビューの​​を上書きすることができます。

class AddDocumentView(LoginRequiredMixin, SuccessMessageMixin, CreateView): 

    def get_form_kwargs(self): 
     kwargs = super(AddDocumentView, self).get_form_kwargs() 
     kwargs['user'] = self.request.user 
     return kwargs 

あなたFileUploadForm今ユーザーオブジェクトを取得しますし、それに応じて結果をフィルタリングします。

+0

うまくいきました。ありがとうございました。私は同じ方法でparent_idを渡すつもりですか? – nastyn8

+0

'parent_id'は何ですか?あなたの意見が知っているものなら、そうです。 – solarissmoke

+0

ありがとう、私はそれを考え出した。 parent_idはURLの主キーでしたので、 "kwargs ['pk'] = self.kwargs ['pk']を引数として受け入れるように__init__を修正しました。 – nastyn8

関連する問題