Как я могу получить текущего пользователя при работе с 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,
))