Python HttpResponseRedirect Reverse参数正在返回视图的名称

Python HttpResponseRedirect Reverse参数正在返回视图的名称,python,django,Python,Django,我是django的新手,所以这可能是一个简单的错误。当我发送视图列表时,参数user_id来自不同视图中相同的HttpResponseRedirect(相同的重定向到视图add中的参数)。它很好用 但是当我单击模板上的submit按钮并调用我得到的add视图时 基数为10的int()的文本无效:“add” 使用print函数,我看到正确的ID int从列表传递到模板,但是在模板和调用列表视图之间的某个地方,它丢失了。然后add将str“add”传递到列表视图。任何帮助都将不胜感激 #views.

我是django的新手,所以这可能是一个简单的错误。当我发送视图列表时,参数user_id来自不同视图中相同的HttpResponseRedirect(相同的重定向到视图add中的参数)。它很好用

但是当我单击模板上的submit按钮并调用我得到的add视图时

基数为10的int()的文本无效:“add”

使用print函数,我看到正确的ID int从列表传递到模板,但是在模板和调用列表视图之间的某个地方,它丢失了。然后add将str“add”传递到列表视图。任何帮助都将不胜感激

#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'),
)
#views.py
def列表(请求,用户id):#列表:列表
#...
#…做事
#...
context=RequestContext(请求)
#获取菜单
main=Menu.objects.get(pk=1)#pk 1是主菜单
main\u menu=main.food\u item\u set.all()
mine=菜单.objects.get(pk=2)#pk 2是我制作的菜单
打印用户id
p=Plan\u User.objects.get(pk=int(User\u id))
id=p.id
返回render_to_response('foods_data/list.html',{'main_menu':main_menu,
'user_id':id},上下文)
def添加(请求):#列表:添加
“”“将所选项目添加到我的菜单。”“”
如果request.method==“POST”:
mine=Menu.objects.get(pk=2)#pk2是在getList.py中生成的我的菜单
f_name=request.POST.get(“选择”)
user\u number=request.POST.get(“user\u number”)
food\u entry=food\u Item.objects.get(food\u name=f\u name)
食物输入。菜单。添加(我的)
返回HttpResponseRedirect(反向(“list:list”,args=(user\u number,))
#list.html
{主菜单%中对象的百分比}
{%csrf_令牌%}

#url.py urlpatterns=模式(“”, url(r'^(?P.+)/$',views.list,name='list'), url(r“^add/$”,views.add,name='add'), url(r“^remove/$”,views.remove,name='remove'), )
您试图使用
反向
,传入的是位置参数,而不是关键字参数。尽管您的代码中可能存在其他错误,但您应该能够使用以下方法反转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'),
)
#url.py
urlpatterns=模式(“”,
url(r“^add/$”,views.add,name='add'),
url(r“^remove/$”,views.remove,name='remove'),
url(r'^(?P\d+/$),views.list,name='list'),
)
两件事-不要将
add
list
用作函数名。另外,将
+
的URL模式移动到模式的末尾