5
respostas

local variable 'form' referenced before assignment

Estou entalado nesse erro

local variable 'form' referenced before assignment

def cadastro_fotos(request):
    if request.method == 'POST':
        form = Foto(request.POST or None, request.FILES)
        if form.is_valid():
            nome_foto=form['nome_foto'].value()
            legenda=form['legenda'].value()
            descricao=form['descricao'].value()
            responsavel=form['responsavel'].value()
        form.save()
            # Redirecionar para uma página de sucesso
        return render(request, 'cadastro_sucesso.html')
   ** return render(request, 'cadastro_fotos.html', {'form':form})**

podem me ajudar?

5 respostas

Olá, Felipe! Tudo bem?

Esse erro ocorre porque a variável form está sendo referenciada na linha de renderização do template (return render(request, 'cadastro_fotos.html', {'form': form})) fora do bloco if request.method == 'POST':. Se a requisição não for do tipo POST, a variável form não será inicializada, causando o erro.

Para corrigir isso, você pode inicializar a variável form fora do bloco if, garantindo que ela sempre tenha um valor. Aqui está uma sugestão de como ajustar o seu código:

def cadastro_fotos(request):
    if request.method == 'POST':
        form = Foto(request.POST, request.FILES)
        if form.is_valid():
            nome_foto = form.cleaned_data['nome_foto']
            legenda = form.cleaned_data['legenda']
            descricao = form.cleaned_data['descricao']
            responsavel = form.cleaned_data['responsavel']
            form.save()
            # Redirecionar para uma página de sucesso
            return render(request, 'cadastro_sucesso.html')
    else:
        form = Foto()  # Inicializa o formulário vazio para requisições GET

    return render(request, 'cadastro_fotos.html', {'form': form})

Note que adicionei a inicialização do formulário form = Foto() no bloco else, para garantir que ele seja inicializado mesmo quando a requisição não for do tipo POST. Além disso, utilizei form.cleaned_data para acessar os dados do formulário de forma segura após a validação.

Espero ter ajudado e caso ainda tenha problemas peço que compartilhe todo o seu projeto para que eu possa analisar todo o contexto do seu projeto.

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

view.py

from django.shortcuts import render, get_object_or_404, redirect
from galeria.models import Foto, Fotografia
from django.contrib import messages
def index(request):
    if not request.user.is_authenticated:
        messages.error(request, 'Usuário não logado')
        return redirect('login')
    fotografias = Fotografia.objects.order_by("data_fotografia").filter(publicada=True)
    return render(request, 'galeria/index.html', {"cards": fotografias})
def imagem(request, foto_id):
    fotografia = get_object_or_404(Fotografia, pk=foto_id)
    return render(request, 'galeria/imagem.html', {"fotografia": fotografia})
def buscar(request):
    if not request.user.is_authenticated:
        messages.error(request, 'Usuário não logado')
        return redirect('login')
    fotografias = Fotografia.objects.order_by("data_fotografia").filter(publicada=True)
    if "buscar" in request.GET:
        nome_a_buscar = request.GET['buscar']
        if nome_a_buscar:
            fotografias = fotografias.filter(nome__icontains=nome_a_buscar)
    return render(request, "galeria/buscar.html", {"cards": fotografias})
from django.shortcuts import render
from .forms import Foto  # Certifique-se de importar o formulário correto
def cadastro_fotos(request):
    if request.method == 'POST':
        form = Foto(request.POST, request.FILES)
        if form.is_valid():
            nome_foto = form.cleaned_data['nome_foto']
            legenda = form.cleaned_data['legenda']
            descricao = form.cleaned_data['descricao']
            responsavel = form.cleaned_data['responsavel']
            form.save()
            # Redirecionar para uma página de sucesso
            return render(request, 'cadastro_sucesso.html')
    else:
        form = Foto()  # Inicializa o formulário vazio para requisições GET
    return render(request, 'cadastro_fotos.html', {'form': form})

urls.py

from django.urls import path
from galeria.views import  cadastro_fotos, index, imagem, buscar

urlpatterns = [
    path('', index, name='index'),
    path('imagem/<int:foto_id>', imagem, name='imagem'),
    path('buscar', buscar, name='buscar'),
    path('cadastro-foto/',cadastro_fotos, name='cadastro_fotos'),

forms.py

from django import forms
from .models import Foto
class FotoForm(forms.ModelForm):
        nome_foto=forms.CharField(
        label='nome_foto', 
        required=True, 
        max_length=100,
        widget=forms.TextInput(
            attrs={
                'class': 'form-control',
                'placeholder': 'Ex.: Nebulosa',
            }
        )
    )
        legenda=forms.CharField(
        label='Legenda', 
        required=True, 
        max_length=100,
        widget=forms.TextInput(
        )
    )
        descricao=forms.CharField(
        label='Descrição', 
        required=True, 
        max_length=100,
        widget=forms.TextInput(
        )
    )
responsavel=forms.CharField(
 label='Responsavel', 
 required=True, 
 max_length=100,
  widget=forms.TextInput(
        )
    )

class FotoForm(forms.ModelForm):
     imagem=forms.ImageField(      
     )

class Meta:
        model = Foto
        fields = ['nome_foto', 'legenda', 'descricao', 'upload_foto', 'responsavel']

def __init__(self, *args, **kwargs):
        super(FotoForm, self).__init__(*args, **kwargs)
        self.fields['upload_foto'].widget.attrs['accept'] = 'image/*'

cadastro_sucesso.html

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cadastro de Fotos - Sucesso</title>
</head>
<body>
    <h1>Cadastro de Fotos - Sucesso</h1>
    <p>O cadastro da foto foi realizado com sucesso!</p>
    <a href="{% url 'cadastro_fotos' %}">Voltar para o formulário de cadastro</a>
</body>
</html>

cadastro_fotos.html

{% load static %}

<!DOCTYPE html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cadastro Tarefas</title>
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600&display=swap" rel="stylesheet">
    <!-- CSS only -->
    <link rel="stylesheet" href="{% static '/styles/style.css' %}">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
</head>
<body>
    <h1>Cadastro de Fotos</h1>
    <form action="{% url 'cadastro_fotos' %}" method="POST">
    {% csrf_token %}
        <div>
            <label for="nome_foto">Nome da Foto:</label>
            <input type="text" id="nome_foto" name="nome_foto" required>
        </div>
        <div>
            <label for="legenda">Legenda:</label>
            <input type="text" id="legenda" name="legenda">
        </div>
        <div>
            <label for="descricao">Descrição:</label>
            <textarea id="descricao" name="descricao"></textarea>
        </div>
        <div>
            <label for="upload_foto">Upload da Foto:</label>
            <input type="file" id="upload_foto" name="upload_foto" accept="image/*" required>
        </div>
        <div>
            <label for="responsavel">Responsável:</label>
            <input type="text" id="responsavel" name="responsavel" required>
        </div>
        <div>
            <button type="submit" class="btn btn-success col-12" style="padding: top 5px;">Cadastrar</button>
        </div>
    </form>
</body>

Tentei mas não consegui ainda, mas obrigado ja esta começando a melhorar. pode me ajudar mais? Mandei mais partes do projeto.

Bom dia, Felipe! Peço desculpa pela demora em respondê-lo.

Poderia compartilhar todo o seu projeto via, GitHub ou Drive do Google?

Quando trabalhamos com um projeto grande que utiliza uma framework como o Django fica meio desconexo pegar códigos avulsos assim para testes, acabei tendo mais problemas para tentar ajustar os códigos que você compartilhou do que tentando entender o problema que você teve.

Logo, caso não seja um incômodo, faça o compartilhamento do projeto como um todo.