Python 如何在Django表单中使用外键筛选select值

Python 如何在Django表单中使用外键筛选select值,python,django,django-forms,django-views,Python,Django,Django Forms,Django Views,我有这个应用程序,我可以上传一个文件到一个特定的类别或子类别。它工作得很好,但我遇到的问题是,当我试图仅为特定用户显示select值时,对于特定父类别,它只显示存储在数据库中的所有值 views.py class AddDocumentView(LoginRequiredMixin, SuccessMessageMixin, CreateView): login_url = reverse_lazy('users:login') form_class = FileUploadFo

我有这个应用程序,我可以上传一个文件到一个特定的类别或子类别。它工作得很好,但我遇到的问题是,当我试图仅为特定用户显示select值时,对于特定父类别,它只显示存储在数据库中的所有值

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)
#  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
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)
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)
我已经尝试了类似问题的解决方案,这就是我是如何做到这一点的,但它仍然没有按用户进行过滤,我也不知道如何让它按父id进行过滤。你知道我做错了什么吗?非常感谢您的帮助,如果需要,我可以提供更多信息

------------解决方案更新-------------------

谢谢@solarissmoke,我能够在表单中获得用户信息。然后,我用kwargs从url中捕获了父id

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)
#  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
然后我将额外的agment(pk)添加到init

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)
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)

表单需要一个
user
参数,但您没有提供参数,因此
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
现在将获得用户对象,并相应地过滤结果。

效果很好,谢谢。我可以用同样的方法传递父id吗?我不知道什么是
parent\u id
?如果这是你的观点所知道的,那么是的。谢谢,我知道了。parent_id是URL中的主键,因此我使用“kwargs['pk']=self.kwargs['pk']并修改init以将其作为参数。我将很快发布更新的解决方案。