【问题标题】:UnboundLocalError: local variable 'form' referenced before assignment in DjangoUnboundLocalError:在 Django 中赋值之前引用了局部变量“表单”
【发布时间】:2018-06-10 07:44:59
【问题描述】:

所以我正在处理一个 Django 项目,这是我的 views.py 文件:

def new_topic(request, pk):
    board = get_object_or_404(Board, pk=pk)
    user = User.objects.first()  # TODO: get the currently logged in user

    if request.method == 'POST':
        form = NewTopicForm(request.POST)
    if form.is_valid():
        topic = form.save()
        return redirect('board_topics', pk=board.pk)
    else:
        form = NewTopicForm()
    return render(request, 'new_topic.html', {'form': form})

当我运行我的服务器时,我收到一条错误消息:

UnboundLocalError: local variable 'form' referenced before assignment

这是我的new_topic.html 文件

{% extends 'base.html' %}

{% block title %}Start a New Topic{% endblock %}

{% block breadcrumb %}
    <li class="breadcrumb-item"><a href="{% url 'home' %}">Boards</a></li>
    <li class="breadcrumb-item"><a href="{% url 'board_topics' board.pk %}">{{ board.name }}</a></li>
    <li class="breadcrumb-item active">New topic</li>
{% endblock %}

{% block content %}
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="btn btn-success">Post</button>
    </form>
{% endblock %}

【问题讨论】:

  • 请注意,Django 引用了这一行:if form.is_valid():

标签: python django django-views


【解决方案1】:

我没有发现缩进有任何问题,但初始化有问题。请在渲染之前进行初始化!如下所示进行更改肯定会奏效,这是摆脱它的一种非常真实和正确的方法:

def new_topic(request, pk):
    board = get_object_or_404(Board, pk=pk)
    user = User.objects.first()  # TODO: get the currently logged in user
    form = NewTopicForm()
    if request.method == 'POST':
        form = NewTopicForm(request.POST)
        if form.is_valid():
           topic = form.save()
           return redirect('board_topics', pk=board.pk)
        else:
            form = NewTopicForm()
    return render(request, 'new_topic.html', {'form': form})

【讨论】:

    【解决方案2】:

    if form.is_valid(): 行在 GET 请求上失败,因为您仅在 request.method == 'POST' 时定义 form

    这可以通过改变一些缩进来解决:

    if request.method == 'POST':
        form = NewTopicForm(request.POST)
        if form.is_valid():
            topic = form.save()
            return redirect('board_topics', pk=board.pk)
    else:
        form = NewTopicForm()
    return render(request, 'new_topic.html', {'form': form})
    

    【讨论】:

      猜你喜欢
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 2020-05-05
      相关资源
      最近更新 更多