[英]DJANGO - local variable 'form' referenced before assignment
我正在嘗試使表單從用戶那里獲取信息並使用此信息發送電子郵件。 這是我的代碼:
#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 %}
<form role="form" action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
{% endblock %}
當我嘗試進入聯系頁面時,出現此錯誤:
local variable 'form' referenced before assignment
它是說錯誤在這一行views.py中:
return render(request, 'blog/inicio.html', {'form': form})
我對 Django 有點新,你能幫我嗎?
您在if request.method == 'POST':
塊中定義form
變量。 如果您使用 GET 請求form
訪問view
,則未定義。 您應該將視圖更改為如下所示:
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})
Django 文檔處理這個問題,但與其他答案略有不同。 請參閱https://docs.djangoproject.com/en/dev/topics/forms/#using-a-form-in-a-view
使用 else,如果請求不是 POST,則創建空白表單。 以下是直接從文檔中粘貼的。
def get_name(request):
# if this is a POST request we need to process the form data
if request.method == 'POST':
# create a form instance and populate it with data from the request:
form = NameForm(request.POST)
# check whether it's valid:
if form.is_valid():
# process the data in form.cleaned_data as required
# ...
# redirect to a new URL:
return HttpResponseRedirect('/thanks/')
# if a GET (or any other method) we'll create a blank form
else:
form = NameForm()
return render(request, 'name.html', {'form': form})
如果可以這么說 - 初始化一個空form
造成附帶損害,那么您也可以提供一個虛擬值作為填充物,直到request.POST
被初始化......
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})
您唯一的問題是您沒有將 ContactForm 聲明為函數,從這里更改;
def contato(request): form_class = ContactForm if request.method == 'POST':
到; def contato(request): form_class = ContactForm() if request.method == 'POST':
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.