Django - Получение значения сессии в форму

У меня есть приложение Django и мне нужно получить значение из сессии и поместить его в HiddenInput.

В моем представлении есть такой код:

@login_required(redirect_field_name='login')
def obra_open_view(request, obra_id):
    obra = get_object_or_404(Obra, pk=obra_id)

    if obra:
        request.session['obra_aberta_id'] = obra.id
        request.session['obra_aberta_name'] = obra.nome
        return redirect('obra_detail_url')
    else:
        request.session['obra_aberta_id'] = 0
        request.session['obra_aberta_name'] = ""
        return redirect('obra_lista_url')

Когда у меня есть некоторое значение 'obra_aberta_id', мне нужно поместить это значение в HiddenInput:

class FormCarga(ModelForm):
    class Meta:
        model = Carga
        fields = ('__all__')
        
        widgets = {
            'tag': forms.TextInput(attrs={'class': 'form-control'}),
            'nome': forms.TextInput(attrs={'class': 'form-control'}),
            'descricao': forms.Textarea(attrs={'class': 'form-control'}),
            'potencia': forms.TextInput(attrs={'class': 'form-control'}),
            'unidade_medida_potencia': forms.Select(attrs={'class': 'form-control'}),
            'area': forms.Select(attrs={'class': 'form-control'}),
            'tensao': forms.Select(attrs={'class': 'form-control'}),
            'fonte': forms.Select(attrs={'class': 'form-control'}),
            'atividade': forms.Select(attrs={'class': 'form-control'}),
            'fator_potencia': forms.Select(attrs={'class': 'form-control'}),
            'condutores_carregados': forms.Select(attrs={'class': 'form-control'}),
            'obra': forms.HiddenInput(attrs={'class': 'form-control','initial' : request.session['obra_aberta_id']}),

        }

Но я получаю ошибку на 'request': имя 'request' не определено

Как я могу получить значение из сессии e, установленное в этом HiddenInput?

Не знаю, помогут ли модели, но в любом случае вот они:

Пожалуйста, удалите из obra виджета начальный дикт.

class FormCarga(ModelForm):

    class Meta:
        model = Carga
        widgets = {
            'obra': forms.HiddenInput(),
            # other staff
        }

После этого вы можете сделать:

def carga_new_view(request):
    initial={'obra': request.session.get('obra_aberta_id')}
    if request.method == 'POST':

        form = FormCarga(request.POST, initial=initial)

        if form.is_valid():
            form.save()
            messages.success(request, 'Carga cadastrada com sucesso!')

            # Redirect para a lista de cargas
            return redirect('carga_list_url')
    else:
        form = FormCarga(initial=initial)
        nome_pagina = 'Nova Carga'

    page_dictionary = {
        'form': form,
        'nome_pagina': nome_pagina,
        'editavel': True,
        'url_lista': 'carga_list_url',
    }

    return render(request, 'item.html', page_dictionary)

Но ПОЖАЛУЙСТА прочитайте о Django-GCBV FormView. В вашем случае:

class CargaNewView(FormView):
    template = 'item.html'
    success_url = 'carga_list_url'
    form_class = FormCarga

    def get_initial(self, *args, **kwargs):
        return super().get_initial(*args, **kwargs) | {'obra': request.session['obra_aberta_id']}

    def get_context_data(self, *args, **kwargs):
        return super().get_context_data(*args, **kwargs) | {'nome_pagina': 'Nova Carga', 'editavel': True, 'url_lista': self.success_url}

Я прохожу, у вас есть ModelForm. В этом случае вы можете использовать Django-GCBV EditView.

Это мой первый вопрос на StackOverflow. Как я могу пометить свой вопрос как решенный?

Вернуться на верх