HttpResponseRedirect反向参数返回视图名称

0 投票
1 回答
991 浏览
提问于 2025-04-18 00:15

我刚接触Django,所以这可能是个简单的错误。当我从一个相同的HttpResponseRedirect中发送视图list的参数user_id(这个重定向和在视图add中的重定向是一样的)时,一切都正常。

但是,当我在模板上点击提交按钮并调用add视图时,我得到了

无效的整数:'add'

我使用print函数查看时发现,正确的ID整数是从list传递到模板的,但在模板和重新调用list视图之间,这个ID就丢失了。然后add把字符串"add"传给了list视图。非常感谢任何帮助。

#views.py
def list(request, user_id): #list:list
    #...
    #...doing stuff
    #...
    context = RequestContext(request)

    #Gets Menus
    main = Menu.objects.get(pk=1) #pk 1 is the Main Menu made
    main_menu = main.food_item_set.all()

    mine = Menu.objects.get(pk=2) #pk 2 is the My Menu made
    print user_id
    p = Plan_User.objects.get(pk = int(user_id))
    id = p.id

    return render_to_response('foods_data/list.html', {'main_menu':main_menu, 
                              'user_id':id}, context)

def add(request): #list:add
    """Adds the selected item to My Menu."""
    if request.method == "POST":
        mine = Menu.objects.get(pk=2) #pk 2 is the My Menu made in getList.py
        f_name = request.POST.get("choice")
        user_number = request.POST.get("user_number")
        food_entry = Food_Item.objects.get(food_name=f_name)
        food_entry.menus.add(mine)

        return HttpResponseRedirect(reverse("list:list", args=(user_number,)))


 #list.html
{% for object in main_menu %}
<form id='main_list' method='post' action="{% url 'list:add' %}">
    {% csrf_token %}
    <input type="hidden" name="choice" value="{{ object.food_name }}">
    <input type="hidden" name="user_number" value="{{ user_id }}">
    <input type="submit" value="Add to Menu" name="selection"/>
    <label for="object{{ forloop.counter }}"></label></br>
</form>


#urls.py

urlpatterns = patterns('',
    url(r'^(?P<user_id>.+)/$', views.list, name='list'),
    url(r'^add/$', views.add, name='add'),
    url(r'^remove/$', views.remove, name='remove'),
)

1 个回答

0

你正在尝试使用 reverse 函数,但传入的是一个 位置参数,而不是 关键字参数。除了代码中可能存在的其他错误之外,你应该可以用以下方式来反转你的 URL:

return HttpResponseRedirect(reverse("list", args=(),
    kwargs={'user_id': user_number}))

正如 @karthikr 提到的,你需要重新安排你的 URL 模式。Django 会从上到下逐个匹配这些模式,而你的第一个 URL 模式允许任何字符 .。这会导致第一个模式总是被匹配,无论第二个和第三个模式是否匹配。

另外,你还需要确保 URL 中的值与你在视图中期望的值相符,在这个例子中,就是一个或多个连续的整数:

#urls.py

urlpatterns = patterns('',
    url(r'^add/$', views.add, name='add'),
    url(r'^remove/$', views.remove, name='remove'),
    url(r'^(?P<user_id>\d+)/$', views.list, name='list'),
)

撰写回答