簡體   English   中英

DJANGO - 賦值前引用的局部變量“表單”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM