Как правильно указать аргумент для URL в шаблоне Django? - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь создать конечную точку API, которая принимает аргумент cc.

Представление для этой конечной точки в модуле api:

def cc_details(request, cc):
    return JsonResponse({'cc': cc})

URL-адрес:

urlpatterns = [
    path('api/cc_details/<int:cc>', api.cc_details, name='cc_details'),
]

Я вызываю URL из шаблона следующим образом:

async function get_cc_details(cc) {
            let url = new URL("{% absurl 'core:analyzer:cc_details' %}" + "/" + cc)
            const response = await fetch(url)
            const json = await response.json()
            console.log(json)
        }

Пользовательский absurl для возврата абсолютного URL:

from django import template
from django.shortcuts import reverse

register = template.Library()

@register.simple_tag(takes_context=True)
def absurl(context, view_name):
    request = context['request']
    return request.build_absolute_uri(reverse(view_name))

Однако, когда я пытаюсь перейти на страницу индекса моего приложения, я получаю следующую ошибку:

django.urls.exceptions.NoReverseMatch: Обратное для 'cc_details' без аргументов, не найденных.Попробован 1 шаблон (ов): ['api / cc_details / (? P [0-9] +) $']

Это будет работать нормально, если я просто вручную, например, перейду к http://127.0.0.1:8000/api/cc_details/123.

Я предполагаю, что я неправильно предоставляю аргумент для URL в функции JS.Как я могу это исправить?

1 Ответ

0 голосов
/ 08 июля 2019

Да, вы правы, что ошибка в URL в get_cc_details.Ваш URL cc_details определяется как целое число в своем пути.Когда вы используете тег шаблона для генерации URL, этот фрагмент кода не знает, что вы добавляете целое число в конец.Вы должны включить его в качестве аргумента в теге шаблона .Не зная специфики того, что происходит на странице, я предполагаю, что у вас есть get_cc_details, принимая cc в качестве аргумента, потому что вы не знаете, какое значение cc вы хотите, когда страница загружается, что важно, потому что этокогда Django отображает этот URL.

Вам нужно сделать что-то вроде этого:

url_string = {% absurl 'core:analyzer:cc_details' foobar %};
url = new URL(url_string.replace("foobar", cc));

К сожалению, нет способа использовать тег шаблона Django без этого обходного пути, потому что тег шаблонабудет оцениваться только при первой загрузке страницы.Итак, если вы хотите, чтобы там было динамическое значение, вам нужно либо сделать это, либо создать другой URL-адрес, который не принимает аргументов просто для использования при рендеринге (в этом случае ваш текущий код будет работать), но в этом случае вы такженеобходимо добавить в обработку ошибок, чтобы иметь дело с кем-то, появляющимся по этому URL без включенного аргумента cc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...