Django:如何在CreateView中获取当前用户并基于此过滤一个ForeignKey选择字段

时间:2018-09-04 21:42:19

标签: django

我正在创建一个费用提交系统,该系统将是多用户的。

出于这个问题的目的,有两个模型:ClaimJourney。用户创建一个索赔,每个索赔可以有多个旅程。我已经制作了gist个代码段,因为它很长。

在此代码段中,我已成功:

  • 由当前用户进行ClaimListView.get_queryset过滤,因此登录的人只能看到自己的声明列表。
  • ClaimCreateView.form_valid设置提交表单时的正确用户。
  • 由当前用户制作了ClaimDetailView.get_queryset个过滤器。如果有人尝试使用该网址获取其他用户的声明详细信息,他们将获得404(完美!)
  • JourneyListView所做的相同操作
  • JourneyDetailView执行与上述相同的操作-如果未授权,则再次执行404:D

但是,当我通过URL访问JourneyCreateView时,claim的下拉框仍然显示其他用户的版权声明。

dropdown box

我应该如何过滤JourneyCreateView类中的用户,以便claim字段仅显示分配给当前用户的声明?

最接近我的解决方案的是this answer,它建议重写__init__中的JourneyForm函数,这将使我感到困惑:

class JourneyForm(forms.ModelForm):
    class Meta:
        model = Journey
        fields = ['date', 'distance','claim']

    def __init__(self,alloweduser,*args,**kwargs):
        super (JourneyForm,self ).__init__(self,*args,**kwargs) # populates the post
        self.fields['claim'].queryset = Claim.objects.filter(tech_id=alloweduser)

但是我不确定如何从alloweduser传递JourneyCreateView,或者更重要的是,要获取此类中的当前用户。

form_valid在这种情况下没有任何用处,因为我正在尝试在提交表单之前获取用户。

1 个答案:

答案 0 :(得分:3)

在视图中,视图正在处理的请求存储在self.request中,因此您可以使用self.request.user获取用户,并使用id获取其self.request.user.id。 >

带有FormMixin [Django-doc]的Django视图具有可以重写以传递参数的方法:get_form_kwargs() [Django-doc]

因此我们可以将其实现为:

from django.views.generic.edit import CreateView

class JourneyCreateView(CreateView):
    model = Journey
    form_class = JourneyForm

    def get_form_kwargs(self, *args, **kwargs):
        kwargs = super().get_form_kwargs(*args, **kwargs)
        kwargs['alloweduser'] = self.request.user.id
        return kwargs

    # ...