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