Я создаю 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, поэтому любая помощь, которую вы можете оказать с этим, очень ценится!