【问题标题】:How can I get the current user when dealing with a Django InlineFormset处理 Django InlineFormset 时如何获取当前用户
【发布时间】:2022-01-18 23:07:35
【问题描述】:

我今天大部分时间都在寻找这个答案。长话短说我试图弄清楚如何获取当前登录的用户 ID,以便我可以动态查询一个字段并根据他们的 ID 显示可供他们使用的选项。除了我需要他们的身份证的部分外,这一切都很好。当他们打开视图时我需要它,而不是在表单保存时间。

这是我的代码示例...

Forms.py

LineItemFormSet = inlineformset_factory(ParentModel, ChildModel, extra=1, fields=['line_item_cost_center','line_item_description','line_item_vendor'])

class LineItemFormSet(LineItemFormSet,BaseInlineFormSet):

def __init__(self, *args, **kwargs):
    self.user = kwargs.pop('user', None)
    print(self.user)
    super(LineItemFormSet, self).__init__(*args, **kwargs)

def add_fields(self, form, index):
    super(LineItemFormSet,self).add_fields(form,index)
    form.fields['line_item_description'].widget.attrs['class'] = 'budget2'
    form.fields['line_item_description'].widget.attrs['placeholder'] = 'Required'
    qs1 = Vendor.objects.exclude(Q(is_active=False)).distinct()
    form.fields['line_item_vendor'].queryset = qs1

上面的工作很好....但是,我正在尝试获取当前用户,以便我可以做类似的事情..

Vendor.objects.filter(Q(admin_access=user)).exclude(is_active=False).distinct()

我已经尝试过继承 BaseInlineFormset 的各种化身......但无济于事。

我尝试过类似...

class BaseFormSet(BaseInlineFormSet):

def __init__(self, *args, **kwargs):    
    self.request = kwargs.pop("request", None)  
    super(BaseFormSet, self).__init__(*args, **kwargs)

然后我做了类似...

LineItemFormSet = inlineformset_factory(ParentEntity, ChildEntity, formset=BaseFormSet, form=ChildForm, extra=1)

formset = LineItemFormSet(form_kwargs={'request': request})

然后我不断收到一条错误消息,提示找不到请求。

我的视图看起来像...

class CreateLineItemView(LoginRequiredMixin,CreateView):
    model = NewLineItem
    form_class = CreateLineItemForm
    template_name = 'create_line_item.html'

    def get(self, request, *args, **kwargs):
        self.object = None
        context = self.get_context_data(object=self.object)
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        budget_line_item_form = CreateLineItemFormSet()
        return self.render_to_response(
            self.get_context_data(form=form,
                                  line_item_form=line_item_form,
                                  context=context,
                                  ))

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

任何关于如何获取当前用户以便我可以利用我的查询集的想法将不胜感激!

【问题讨论】:

  • 不应该是formset = LineItemFormSet(request=request),否则你得从form_kwargs得到请求
  • @BrianDestura 感谢您的反馈。我试过你的建议,它仍然一直说请求未定义。
  • 你能分享你尝试过的最新代码吗?
  • @BrianDestura 我实际上正在使用上面概述的代码,并按照您的建议更改了有问题的行,这就是我收到的错误消息。
  • formset = LineItemFormSet(request=request)

标签: django django-models django-views django-forms django-templates


【解决方案1】:

总之说来话长。只需在用户登录时使用 session 变量即可。

def login(request):
  #your code here
  request.session['userID']=the_user_id
  .
  .
  #rest of your code

现在您可以在任何视图或模板中使用此 ID。喜欢

#在任何其他视图中

def myview(request):
  user_id=request.session['userID']
  #rest of your code

#in 模板

您可以直接在模板中使用用户ID,如

{{request.session.userID}}

您可以在 DOM 中创建一个全局变量以供 javascript 使用

<script>
window.userID={{request.session.userID}};
//use userID variable anywhere in DOM
</script>

【讨论】:

    【解决方案2】:

    所以这就是答案....基于这个 SO。 Django key error "request" when using inlineformset

    从表单中删除此引用....

    qs1 = Vendor.objects.exclude(Q(is_active=False)).distinct()
    form.fields['line_item_vendor'].queryset = qs1
    

    而是从get中过滤你想要的东西......

    def get(self, request, *args, **kwargs):
        self.object = None
        context = self.get_context_data(object=self.object)
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        budget_line_item_form = CreateLineItemFormSet()
    
        budget_line_item_form.form.base_fields['line_item_vendor'].queryset = \
        Vendor.objects.filter(Q(access_level="Public")
        | Q(access_level="Private",admin_access=user)
        ).exclude(is_active="False")
    
        return self.render_to_response(
            self.get_context_data(form=form,
                                  line_item_form=line_item_form,
                                  context=context,
                                  ))
    

    【讨论】:

      猜你喜欢
      • 2018-10-03
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 2013-11-22
      • 2011-08-22
      • 2021-09-26
      • 2014-05-02
      • 1970-01-01
      相关资源
      最近更新 更多