Django - ошибка NoReverseMatch с двумя фрагментами в URL шаблона - PullRequest
0 голосов
/ 12 апреля 2020

Я создаю Django сайт, на котором в URL есть несколько слагов:

www.example.com/app-name/country_slug/area_slug

Например,

www.example.com/destinations/united-states/new-york

У меня шаблон URL работает нормально, используя этот код в URL. py:

urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('<slug:country_slug>/', views.CountryView.as_view(), name='country'),
    path('<slug:country_slug>/<slug:area_slug>/', views.AreaView.as_view(), name='area'),
]

Если я введу URL в адресную строку браузера, я смогу получить доступ к странице без проблем. Проблема поставляется с шаблоном для представления «страна». Я изо всех сил пытаюсь создать ссылку на страницу 'area', так как для этого нужно ссылаться на 'country_slug' и 'area_slug' в теге {% url%}. Вот ошибка, которую я получаю:

NoReverseMatch at /destinations/united-states/
Reverse for 'area' with arguments '('', '')' not found. 1 pattern(s) tried: ['destinations/(?P<country_slug>[-a-zA-Z0-9_]+)/(?P<area_slug>[-a-zA-Z0-9_]+)/$']

Вот код, который я использую в шаблоне:

{% if latest_area_list %}
    <ul>
        {% for area in latest_area_list %}
            <li><a href="{% url 'destinations:area' country.country_slug area.area_slug %}">{{ area.area_name }}</a></li>
        {% endfor %}
{% endif %}

И представление:

class CountryView(generic.ListView):
    template_name = 'destinations/country.html'
    context_object_name = 'latest_area_list'
    slug_field = 'country_slug'
    slug_url_kwarg = 'country_slug'

    def get_queryset(self):
        self.country = get_object_or_404(Country, country_slug=self.kwargs['country_slug'])
        return Area.objects.filter(country=self.country)

class AreaView(generic.ListView):
    template_name = 'destinations/area.html'
    context_object_name = 'latest_place_list'
    slug_field = 'area_slug'
    slug_url_kwarg = 'area_slug'

    def get_queryset(self):
        self.area = get_object_or_404(Area, area_slug=self.kwargs['area_slug'])
        return Place.objects.filter(area=self.area)

И модели:

class Country(models.Model):
    country_name = models.CharField(max_length=50, unique=True)
    country_slug = models.SlugField(max_length=50, unique=True, null=False)

    def __str__(self):
        return self.country_name

class Area(models.Model):
    country = models.ForeignKey(Country, on_delete=models.PROTECT)
    area_name = models.CharField(max_length=50
    area_slug = models.SlugField(max_length=50, unique=True, null=False)

    def __str__(self):
        return self.area_name

Кажется, что 'country_slug' и 'area_slug' передаются шаблонам URL просто отлично, но это не передается шаблону.

Возможно, стоит отметить, что:

  • Код работал нормально, когда в URL был только 1 динамический c слаг, проблема была связана с включением 2 слагов в один URL.
  • Если я закомментирую гиперссылку в шаблоне, страница загружается без ошибок. Так что проблема явно со ссылкой в ​​шаблоне.

Я совершенно новичок в Django, поэтому любая помощь, которую вы можете оказать с этим, очень ценится!

1 Ответ

0 голосов
/ 12 апреля 2020

Вы можете использовать ключевое слово синтакс, как в документах

{% url 'destinations:area' country_slug=country.country.slug area_slug=area.area_slug %}
...