我正在创建一个费用提交系统,该系统将是多用户的。
出于这个问题的目的,有两个模型:Claim
和Journey
。用户创建一个索赔,每个索赔可以有多个旅程。我已经制作了gist个代码段,因为它很长。
在此代码段中,我已成功:
ClaimListView.get_queryset
过滤,因此登录的人只能看到自己的声明列表。ClaimCreateView.form_valid
设置提交表单时的正确用户。ClaimDetailView.get_queryset
个过滤器。如果有人尝试使用该网址获取其他用户的声明详细信息,他们将获得404(完美!)JourneyListView
所做的相同操作JourneyDetailView
执行与上述相同的操作-如果未授权,则再次执行404:D 但是,当我通过URL访问JourneyCreateView
时,claim
的下拉框仍然显示其他用户的版权声明。
我应该如何过滤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
在这种情况下没有任何用处,因为我正在尝试在提交表单之前获取用户。
答案 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
# ...