0

我正在创建一个 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 很陌生,因此非常感谢您提供的任何帮助!

4

1 回答 1

0

您可以像在文档中一样使用关键字 synthax

{% url 'destinations:area' country_slug=country.country.slug area_slug=area.area_slug %}
于 2020-04-12T12:49:39.963 回答