我正在创建一个 Django 站点,其中 URL 具有多个 slug:
www.example.com/app-name/country_slug/area_slug
例如
www.example.com/destinations/united-states/new-york
我在 urls.py 中使用此代码使 URL 模式工作正常:
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,我可以毫无问题地访问该页面。该问题与视图“国家”的模板一起出现。我正在努力创建指向“区域”页面的链接,因为这需要在 {% url %} 标记中引用“country_slug”和“area_slug”。这是我得到的错误:
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 个动态 slug 时,代码运行良好,问题是在单个 URL 中包含 2 个 slug。
- 如果我注释掉模板中的超链接,页面加载时不会出现错误。所以问题显然出在模板中的链接上。
我对 Django 很陌生,因此非常感谢您提供的任何帮助!