DJANGO – variável local ‘form’ referenciada antes da atribuição

Estou tentando fazer um formulário obter informações do usuário e usar essas informações para enviar um email. Aqui está meu código:

#forms.py from django import forms class ContactForm(forms.Form): nome = forms.CharField(required=True) email = forms.EmailField(required=True) msg = forms.CharField( required=True, widget=forms.Textarea ) #views.py from django.shortcuts import render, redirect, get_object_or_404, HttpResponseRedirect, render_to_response from django.core.mail import send_mail from .forms import ContactForm def contato(request): form_class = ContactForm if request.method == 'POST': form = form_class(request.POST) if form.is_valid(): nome = request.POST.get('nome') email = request.POST.get('email') msg = request.POST.get('msg') send_mail('Subject here', msg, email, ['testmail@gmail.com'], fail_silently=False) return HttpResponseRedirect('blog/inicio') return render(request, 'blog/inicio.html', {'form': form}) #contato.html {% extends "blog/base.html" %} {% block content %}  {% csrf_token %} {{ form.as_p }}   {% endblock %} 

e quando eu tento entrar na página de contato eu recebo este erro:

 local variable 'form' referenced before assignment 

insira a descrição da imagem aqui

Está dizendo que o erro está nesta linha de views.py:

 return render(request, 'blog/inicio.html', {'form': form}) 

Eu sou um pouco novo no Django, você pode por favor me ajudar?

Você define a variável de form neste if request.method == 'POST': block. Se você acessar a view com um form solicitação GET, não será definido. Você deve mudar a visão para algo como isto:

 def contato(request): form_class = ContactForm # if request is not post, initialize an empty form form = form_class(request.POST or None) if request.method == 'POST': if form.is_valid(): nome = request.POST.get('nome') email = request.POST.get('email') msg = request.POST.get('msg') send_mail('Subject here', msg, email, ['testmail@gmail.com'], fail_silently=False) return HttpResponseRedirect('blog/inicio') return render(request, 'blog/inicio.html', {'form': form}) 

Se pode haver assim dizer – “danos colaterais”, inicializando um “formulário” vazio, então você também pode fornecer um valor “fictício” como um enchimento, até que o “request.POST” seja inicializado …

 def contato(request): form = "Dummy String" form_class = ContactForm # if request is not post, initialize an empty form #form = form_class(request.POST or None) # Maybe Not form = form_class(request.POST ) # Instead if request.method == 'POST': if form.is_valid(): nome = request.POST.get('nome') email = request.POST.get('email') msg = request.POST.get('msg') send_mail('Subject here', msg, email, ['testmail@gmail.com'], fail_silently=False) return HttpResponseRedirect('blog/inicio') return render(request, 'blog/inicio.html', {'form': form})