Python NoReverseMatch at/34/订单/更新/

Python NoReverseMatch at/34/订单/更新/,python,django,Python,Django,问题:更新表单时,我遇到以下错误: Reverse for 'detail_order' with keyword arguments '{'pk': 34}' not found. 1 pattern(s) tried: ['(?P<purchaseorder_id>[0-9]+)/detail_order$'] 如何修改视图以将pk链接到purchaseorder_id 视图.py class OrderUpdate(UpdateView): model = Pur

问题:更新表单时,我遇到以下错误:

Reverse for 'detail_order' with keyword arguments '{'pk': 34}' not found. 1 pattern(s) tried: ['(?P<purchaseorder_id>[0-9]+)/detail_order$']
如何修改视图以将pk链接到purchaseorder_id

视图.py

class OrderUpdate(UpdateView):  
    model = PurchaseOrder
    template_name = 'accounting/orders/edit_order.html'
    form_class = PurchaseOrderForm
    success_url = None
  
    def get_context_data(self, **kwargs):
        data = super(OrderUpdate, self).get_context_data(**kwargs)
        if self.request.POST:
            data['lines'] = OrderLineFormSet(self.request.POST, instance=self.object)
        else:
            data['lines'] = OrderLineFormSet(instance=self.object)
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        lines = context['lines']
        with transaction.atomic():
            form.instance.created_by = self.request.user
            self.object = form.save()
            if lines.is_valid():
                lines.instance = self.object
                lines.save()
        return super(OrderUpdate, self).form_valid(form)

    def get_success_url(self):
        return reverse_lazy('accounting:detail_order', kwargs={'pk': self.object.pk})
    
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(OrderUpdate, self).dispatch(*args, **kwargs)

@login_required(login_url="/login/")
def detail_order(request, purchaseorder_id):
    order = get_object_or_404(PurchaseOrder, pk=purchaseorder_id)
    orderlines = OrderLine.objects.all()
    return render(request, 'accounting/orders/order_detail.html', {'order': order, 'orderlines': orderlines}) 
url(r'^(?P<purchaseorder_id>[0-9]+)/detail_order$', views.detail_order, name='detail_order'),
url.py

class OrderUpdate(UpdateView):  
    model = PurchaseOrder
    template_name = 'accounting/orders/edit_order.html'
    form_class = PurchaseOrderForm
    success_url = None
  
    def get_context_data(self, **kwargs):
        data = super(OrderUpdate, self).get_context_data(**kwargs)
        if self.request.POST:
            data['lines'] = OrderLineFormSet(self.request.POST, instance=self.object)
        else:
            data['lines'] = OrderLineFormSet(instance=self.object)
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        lines = context['lines']
        with transaction.atomic():
            form.instance.created_by = self.request.user
            self.object = form.save()
            if lines.is_valid():
                lines.instance = self.object
                lines.save()
        return super(OrderUpdate, self).form_valid(form)

    def get_success_url(self):
        return reverse_lazy('accounting:detail_order', kwargs={'pk': self.object.pk})
    
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(OrderUpdate, self).dispatch(*args, **kwargs)

@login_required(login_url="/login/")
def detail_order(request, purchaseorder_id):
    order = get_object_or_404(PurchaseOrder, pk=purchaseorder_id)
    orderlines = OrderLine.objects.all()
    return render(request, 'accounting/orders/order_detail.html', {'order': order, 'orderlines': orderlines}) 
url(r'^(?P<purchaseorder_id>[0-9]+)/detail_order$', views.detail_order, name='detail_order'),
url(r'^(?P[0-9]+)/detail\u order$,views.detail\u order,name='detail\u order'),

您的模式需要一个关键字参数
purchaseorder\u id
,但您传递它
pk
。此外,您还重写了
get_success\u url
,但您使用的是
reverse\u lazy
,这可能会根据Django版本(在最近的版本中似乎是固定的),因为
get_success\u url
应该返回字符串(
reverse\u lazy
返回惰性对象)。更改您的
get\u success\u url
,如下所示:

从django.url反向导入
def get_success_url(自我):
返回反向('accounting:detail_order',kwargs={'purchaseorder_id':self.object.pk})

您的模式需要一个关键字参数
purchaseorder\u id
,但您传递它
pk
。此外,您还重写了
get_success\u url
,但您使用的是
reverse\u lazy
,这可能会根据Django版本(在最近的版本中似乎是固定的),因为
get_success\u url
应该返回字符串(
reverse\u lazy
返回惰性对象)。更改您的
get\u success\u url
,如下所示:

从django.url反向导入
def get_success_url(自我):
返回反向('accounting:detail_order',kwargs={'purchaseorder_id':self.object.pk})

@Alasdair我看到了一个例子,这是导致错误的原因。另外,如果您看到
get_success\u url
的内置实现,它会以这种方式返回url
return str(self.success\u url)#success\u url可能很懒
,@Alasdair,尽管看起来这是一个已解决的问题,所以您至少在最新版本中是正确的。感谢您的回复,这很有趣。我曾多次建议在不需要惰性版本时将
reverse\u lazy
切换到
reverse\u lazy
,但我从未遇到过
reverse\u lazy
在某些Django版本中导致错误的情况。@Alasdair我见过一个导致错误的例子。另外,如果您看到
get_success\u url
的内置实现,它会以这种方式返回url
return str(self.success\u url)#success\u url可能很懒
,@Alasdair,尽管看起来这是一个已解决的问题,所以您至少在最新版本中是正确的。感谢您的回复,这很有趣。我曾多次建议在不需要惰性版本时将
reverse\u lazy
切换到
reverse
,但我从未遇到过
reverse\u lazy
在某些Django版本中导致错误的情况。