首页 > 解决方案 > 如何修复 NoReverseMatch

问题描述

我正在尝试更新我的菜单项以添加和编辑菜单项,但无法移动到下一页。尽管菜单项更新或添加。

视图.py

def addMenu(request, id):
    if request.method == 'POST':
        form = menuForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('menu')
    else:
        form = menuForm()
        context = {'form': form}
    return render(request, 'addMenu.html', context)


def editMenu(request, id):
    menu = get_object_or_404(Menu, pk=id)
    if request.method == 'POST':
        form = menuForm(request.POST, instance=menu)
        if form.is_valid():
            form.save()
            return redirect('menu')
    else:
        form = menuForm(instance=menu)
        context = {'form': form}
        return render(request, 'editMenu.html', context)

模型.py

class Restaurants(models.Model):
    restaurant_name = models.CharField(max_length=250, null=True, blank=True)

    def __str__(self):
        return self.restaurant_name


class Menu(models.Model):
    restaurant_name = models.ForeignKey(Restaurants, on_delete=models.CASCADE, related_name='restaurants', null=True)
    name = models.CharField(max_length=250, blank=True, null=True)
    description = models.TextField(max_length=250)
    price = models.CharField(max_length=8)
    course = models.CharField(max_length=250)

网址.py

lpatterns = [

     path('', views.showRestaurants, name='restaurants'),
     path('add/', views.addRestaurants, name='add'),
     path('edit/<id>', views.editRestaurants, name='edit'),
     path('<id>/delete/', views.deleteRestaurants, name='delete'),
     path('menu/<id>', views.showMenu, name='menu'),
     path('addmenu/<id>/', views.addMenu, name='addmenu'),
     path('menu/edit/<id>', views.editMenu, name='editmenu'),
     path('menu/<id>/delete', views.deleteMenu, name='deletemenu'),

 ]

编辑.html

<form method='POST'>
                {% csrf_token %}
                {{ form.as_p }}
                <button type="submit">Update</button>

            </form>

每次我点击更新时,我都会进入这个错误页面

Exception Type: NoReverseMatch
Exception Value:    
Reverse for 'menu' with no arguments not found. 1 pattern(s) tried: ['menu\\/(?P<id>[^/]+)$']

尽管菜单项已更新并添加到我的菜单列表中

标签: django

解决方案


您的menuURL 模式需要一个 id,

 path('menu/<id>', views.showMenu, name='menu'),

但是当您尝试重定向时没有提供 id:

 return redirect('menu')

看起来你应该这样做:

 return redirect('menu', id=id)

推荐阅读