私は特定のカテゴリまたはサブカテゴリにファイルをアップロードできるこのアプリケーションを持っています。それはうまく動作しますが、問題は私が特定のユーザーと特定の親カテゴリに対してのみ選択値を表示しようとしているときに、データベースに格納されているすべての値を表示しているときです。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)
うまくいきました。ありがとうございました。私は同じ方法でparent_idを渡すつもりですか? – nastyn8
'parent_id'は何ですか?あなたの意見が知っているものなら、そうです。 – solarissmoke
ありがとう、私はそれを考え出した。 parent_idはURLの主キーでしたので、 "kwargs ['pk'] = self.kwargs ['pk']を引数として受け入れるように__init__を修正しました。 – nastyn8