Как я могу получить текущего пользователя при работе с Django InlineFormset

Я провел большую часть сегодняшнего дня в поисках этого ответа. Короче говоря, я пытаюсь выяснить, как получить ID текущего пользователя, который вошел в систему, чтобы я мог динамически запрашивать поле и показывать доступные ему опции на основе его 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 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

Любые идеи о том, как я могу получить текущего пользователя, чтобы я мог использовать его с моим набором запросов, будут высоко оценены!

И длинная история вкратце. Просто используйте переменную сессии, когда пользователь входит в систему.

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

Теперь вы можете использовать этот идентификатор в любом представлении или шаблоне. Например

# в любом другом представлении

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

#in template

Вы можете напрямую использовать идентификатор пользователя в шаблонах, например

{{request.session.userID}}

ИЛИ

Вы можете сделать глобальную переменную в DOM для использования javascript

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

Вот ответ.... на этот SO. Django ошибка ключа "request" при использовании 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,
                              ))
Вернуться на верх