在Django中遇到'local variable 'form' referenced before assignment'错误需要帮助

0 投票
2 回答
8591 浏览
提问于 2025-04-16 05:08

我在使用Django的时候遇到了一些问题。我在我的应用里创建了一个表单,用来填写客户的详细信息。现在我想创建一个可以编辑这个表单的功能。但是,当我访问 /index/edit_client/1 这个地址时,出现了错误。

local variable 'form' referenced before assignment

我不知道这个错误的具体原因是什么,不过我查看了一些内容,似乎没有什么帮助。当然,如果有其他方法可以创建一个编辑表单来修改客户信息,那就更好了。这里还有一些输出信息,可能也会有帮助。

# urls.py
    urlpatterns = patterns('',
    (r'^index/$', login_required(direct_to_template), { 'template': 'index.html' }),
    (r'^index/clients/$', client_info),
    (r'^index/clients_details/(?P<id>\d+)/$', clients_details),
    (r'^index/edit_client/(?P<id>\d+)/$', edit_client),
)

# views.py
@login_required 
def edit_client(request, id=1):
    clients_list = Client.objects.filter(pk=id)  
    if request.method == 'POST':
        form = ClientForm(request.POST or None)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/index/clients/')
        else: form = ClientForm()
    return render_to_response('edit_client.html', {'form': form},  context_instance=RequestContext(request))

#edit_client.html
{% extends "base.html" %}

{% block content %}
<font face="verdana,news gothic,arial,heltevica,serif">
    <h3>Edit Client</h3>
</font>
<form method= "POST" action="">
    <font face="verdana,news gothic,arial,heltevica,serif">
    <div id="form">
        <table>
            {{form.as_table}}
        </table>
        <div align="center" STYLE=" margin-right:190px">
            <input type="submit" value="Submit" STYLE="background-color:#E8E8E8; color:#181818 "/>
        </div>
    </div>
</form>
{% endblock %}

2 个回答

1

在你的 edit_client 方法里,你把 form 作为响应的一部分传了出去。但是,如果这个方法不是通过 POST 请求调用的,你就没有初始化 form 这个东西。

5

这段代码总是会执行:

return render_to_response('edit_client.html', {'form': form}

但是如果 request.method 不是 POST,那么 form 就不会被赋值。

修正后的代码:

@login_required 
def edit_client(request, id=1):
    clients_list = Client.objects.filter(pk=id)  
    form = ClientForm()
    if request.method == 'POST':
       form = ClientForm(request.POST or None)
       if form.is_valid():
           form.save()
           return HttpResponseRedirect('/index/clients/')
    return render_to_response('edit_client.html', {'form': form},  context_instance=RequestContext(request))

撰写回答