Исправление отсутствия обратного соответствия в проекте Django

Я получаю следующую ошибку: Reverse for 'order_pdf' with arguments '('',)' not found. 1 pattern(s) tried: ['business_plan/(?P<id>[0-9]+)/pdf/$']

Я не уверен, в чем именно причина этого.

Вот модель:

class Info(models.Model):
    logo                = models.ImageField(default='report-cover.jpg', null=True, blank=True)
    date_posted         = models.DateTimeField(default=timezone.now)
    name                = models.CharField(null=True, blank=True, max_length=100)

Вот views.py

def order_pdf(request, info_id):
    info = get_object_or_404(Info, id=info_id)
    html = render_to_string('businessplan/pdf.html', {'info': info})
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'filename="{}-Business Plan.pdf"'.format(info.businessName)
    weasyprint.HTML(string=html, base_url=request.build_absolute_uri()).write_pdf(response,
                                                                                  stylesheets=[weasyprint.CSS(settings.STATICFILES_DIRS[0] + '\css\\report.css')], presentational_hints=True)
    return response

Вот urls.py

app_name = 'businessplan'

urlpatterns = [
    path('<str:info_id>/pdf/', order_pdf, name='order_pdf'),
]

Вот шаблон:

<a href="{% url 'businessplan:order_pdf' Info.id %}">

Я пробовал изменить info_id на id, но это не помогло.

Какова причина этой ошибки?

Похоже, что <a href="{% url 'businessplan:order_pdf' Info.id %}"> не работает, потому что вы не передаете его в контекст шаблона.

В результате вызов не работает, поскольку Info.id является пустой строкой (ср. https://docs.djangoproject.com/en/3.2/ref/templates/api/#invalid-template-variables), что нарушает логику реверсирования URL.

Для того чтобы это работало, вы должны передать свой экземпляр info в контекст шаблона, например, так:

return render(
    request,
    'businessplan/businessplan.html',
    {
        'form': form,
        'successful_submit': False,
        "Info": info_instance
    }
)
Вернуться на верх