Django POST在视图中发布

时间:2014-06-02 05:45:26

标签: django python-2.7 django-views

我试图允许用户更新模型的布尔变量,但我似乎无法将更改保存到数据库,然后将更改呈现给模板。该模型是' Pic'布尔变量是' Good'。

在模板中(命名空间' single_picture'):

<form action="" method="POST">
    {% csrf_token %}
    {% if Pic.Good %}
    <input type="submit" name="choice" id="{{ Pic.id }}" value="False" />
    {% else %}
    <input type="submit" name="choice" id="{{ Pic.id }}" value="True" />
    {% endif %}
</form>

在应用的网址中:

url(r'^(?P<Pic_id>\d+)/$', views.single_picture, name='single_picture'),

并在views.py中:

def single_picture(request, Pic_id):
# 'detail' in tutorial
if request.method == 'GET':
    pic = get_object_or_404(Pic, pk=Pic_id)
    latest_pictures_list = Pic.objects.all()
    return render(request, 'pictures/single_picture.html', {'Pic': pic, 'latest_pictures_list': latest_pictures_list})
elif request.method == 'POST':
    pic = get_object_or_404(Pic, pk=Pic_id)
    latest_pictures_list = Pic.objects.all()
    try:
        pic.Good=request.POST['choice']
    except (KeyError, Pic.DoesNotExist):
        return render(request, 'pictures/single_picture.html', {'Pic': pic, 'error_message': 'uhhhh...',
        })
    else:
        pic.save()
        return HttpResponseRedirect(reverse('pictures:pic', pic.id))

如果我在try:语句末尾打印pic.Good到终端我可以看到它显示已更改的一个,但pic.save()似乎没有将它保存到db,我也得到了

在/ pictures / 4 /

处配置不当

包含的urlconf 4中没有任何模式

在render语句中。这似乎表明项目或应用程序的网址中缺少某些内容。如何正确保存更改并进行更改?

2 个答案:

答案 0 :(得分:1)

根据django documentation on reverse function,第二个参数是urlconf参数。

  

urlconf参数是包含用于反转的url模式的URLconf模块。

要为url构造提供参数,您需要使用 args kwargs 命名参数。

尝试将return语句更改为以下内容:

return HttpResponseRedirect(reverse('pictures:pic', args=[pic.id]))

我不了解数据库保存问题,但尝试将您的图片保存调用更接近pic更新代码以进行调试:

elif request.method == 'POST':
    pic = get_object_or_404(Pic, pk=Pic_id)
    latest_pictures_list = Pic.objects.all()
    try:
        pic.Good=request.POST['choice']
        pic.save()
        return HttpResponseRedirect(reverse('pictures:pic', args=[pic.id]))
    except (KeyError, Pic.DoesNotExist):
        return render(request, 'pictures/single_picture.html', {'Pic': pic,     'error_message': 'uhhhh...',
        })

修改1

关于NoReverseMatch错误,您使用的是url namespaces(&#39;图片:图片&#39;)。我对它不太熟悉,但我想 reverse 函数在url配置中使用 name =&#39; pic&#39; 查找视图对于图片应用。

您确定,您的网址配置文件中存在此类视图吗?

答案 1 :(得分:-1)

不是你问题的答案,但一个好的建议是替换它:

<form action="" method="POST">
    {% csrf_token %}
    {% if Pic.Good %}
    <input type="submit" name="choice" id="{{ Pic.id }}" value="False" />
    {% else %}
    <input type="submit" name="choice" id="{{ Pic.id }}" value="True" />
    {% endif %}
</form>

用这个:

<form action="" method="POST">
    {% csrf_token %}
    <input type="submit" name="choice" id="{{ Pic.id }}" value={% if Pic.Good %}"True"{% else %} "False" {% endif %} />
</form>