【问题标题】:Save form and redirect to same url - Fails to save the changes - Django保存表单并重定向到相同的 url - 无法保存更改 - Django
【发布时间】:2016-02-22 06:16:25
【问题描述】:

我的 HTML http://127.0.0.1:8000/orden-detalle/1

<form method="POST">
{% csrf_token %}
{% if orden.anulado == True %}
    <ul>
        <li><input id="estado_reanudar" name="estado" value="FALSE" type="radio">Anulado</li>
        <input type="hidden" name="pk" value="{{ orden.pk }}">
    </ul>
    <ul>
        <li>
            <input type="submit" value="Reanudar Orden" />
        </li>
    </ul>
{% else %}
    <ul>
        <li><input id="estado_reanudar" name="estado" value="TRUE" type="radio">Activo</li>
        <input type="hidden" name="pk" value="{{ orden.pk }}">
    </ul>
    <ul>
        <li>
            <input type="submit" value="Anular Orden" />
        </li>
    </ul>
{% endif %}

我的意见.py

def orden_detalle(request, pk=False):
    if pk:
        orden = get_object_or_404(Orden, pk=pk)
    else:
        orden = Orden()

    if request.method == 'POST':
        estado = request.POST.get('estado')
        pk = request.POST.get('pk')
        orden.anulado = estado
        orden.save()
        return HttpResponseRedirect(reverse('ordenes:orden_detalle', args=(pk)))

    template = 'ordenes/orden_detalle.html'
    return render(request, template, locals())

终端

[19/Nov/2015 16:03:17] "POST /orden-detalle/1 HTTP/1.1" 302 0
[19/Nov/2015 16:03:17] "GET /orden-detalle/1 HTTP/1.1" 200 2885

我的 urls.py

urlpatterns = [
    url(r'^ordenes/$', views.orden_listado, name='orden_listado'),
    url(r'^orden-detalle/(?P<pk>[-\d]+)$', views.orden_detalle,name='orden_detalle'),
]

当我使用表单更改“orden”的“estado”时,会抛出错误 302。 它应该改变我的html,但没有。 哪里出错了?

【问题讨论】:

  • 302 不是错误,它是对重定向的响应。在您的情况下,是您的HttpResponseRedirect 造成了这种情况。
  • @ShangWang 我可以解决吗?
  • 没有错误信息,所以没有什么可修复的。你目前的方法有什么问题?需要进一步了解web开发的基础知识,302回复:en.wikipedia.org/wiki/HTTP_302
  • @ShangWang 当我在“orden.save()”之后打印“orden.anulado”时显示“orden.anulado”发生了变化。但它看不到数据库中的变化。无法保存更改。该字段是一个布尔值。
  • 那么您需要编辑您的问题以反映这一点。唯一可能不起作用的是您拥有pk = request.POST.get('pk'),但从未使用过pk。除此之外,我认为您的代码应该可以工作。

标签: python django forms post


【解决方案1】:

现在可以了。我将我的“视图”修改为:

def orden_detalle(request, pk=False):
    if pk:
        orden = get_object_or_404(Orden, pk=pk)
    else:
        orden = Orden()

    if request.method == 'POST':
        orden.anulado = not orden.anulado
        orden.save()
        return HttpResponseRedirect(reverse('ordenes:orden_detalle', args=(pk)))

    template = 'ordenes/orden_detalle.html'
    return render(request, template, locals())

还有我的html:

<form method="POST">
{% csrf_token %}
{% if orden.anulado == 1 %}
    <ul>
        <li>Anulado</li>
        <li>
            <input type="submit" value="Reanudar Orden" />
        </li>
    </ul>
{% else %}
    <ul>
        <li>Activo</li>
        <li>
            <input type="submit" value="Anular Orden" />
        </li>
    </ul>
{% endif %}
</form>

我认为代码 302 是一个错误,我错了。文档表明子类 HttpResponseRedirect 返回 HTTP 状态代码 302。 https://docs.djangoproject.com/en/1.8/ref/request-response/#django.http.HttpResponseRedirect https://en.wikipedia.org/wiki/HTTP_302

【讨论】:

    【解决方案2】:

    更改单选按钮中的值:

     <li><input id="estado_reanudar" name="estado" value="0" type="radio">Anulado</li>
    
     <li><input id="estado_reanudar" name="estado" value="1" type="radio">Activo</li>
    

    【讨论】:

      猜你喜欢
      • 2016-08-20
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多