Объединение более одного слизняка в URL - PullRequest
1 голос
/ 17 марта 2019

Я пытаюсь использовать два слага для генерации URL типа поста.Мой сайт разделен по категориям, и у каждого из них есть один или несколько постов.

views.py

def singlePost(request, slug_post):
    blogpost = get_object_or_404(BlogPost, slug_post=slug_post)
    context = {"blogpost": blogpost}
    return render(request, "blog/single_post.html", context)


def singleCategory_postList(request, slug_category):
    category = get_object_or_404(Category, slug_category=slug_category)
    blogpost = BlogPost.objects.filter(category=category)
    context = {
            "category": category,
            "blogpost": blogpost,
            }
    return render(request, "blog/single_category.html", context)

urls.py, который я использую

path("category/<slug:slug_category>/", views.singleCategory_postList, name="single_category"),
path("<slug:slug_post>/", views.singlePost, name='single_blog_post'),

urls.py, который я хотел бы использовать

path("<slug:slug_category>/", views.singleCategory_postList, name="single_category"),
path("<slug:slug_category>/<slug:slug_post>/", views.singlePost, name='single_blog_post'),

Когда я использую вторую пару путей, мне показано следующее:

NoReverseMatch в / blog / gis /

Реверс для 'single_blog_post' с аргументами ключевого слова '{' slug_post ':' rete-dei-sottoservizi-quadro-normativo '}' не найден,Попробован 1 шаблон (ов): ['blog \ / (? P [-a-zA-Z0-9 _] +) \ / (? P [-a-zA-Z0-9 _] +) \ / $']

models.py

class Category(models.Model):
    category_name = models.CharField(
                        max_length=50,
                        verbose_name="Categorie",
                        help_text="Every category must be not longer then 50 characters",
                        unique=True,
                        )
    slug_category = models.SlugField(
                verbose_name="Slug",
                unique=True,
                help_text="Slug is a field in autocomplete mode, but if you want you can modify its contents",
                )
....

    def __str__(self):
        return self.category_name

    def get_absolute_url(self): 
        return reverse("single_category", kwargs={"slug_category": self.slug_category})


class BlogPost(ModelPost, TimeManager):
    category = models.ForeignKey(
                    Category,
                    on_delete=models.CASCADE,
                    related_name="category_set",
                    verbose_name="Categorie",
                    help_text="Select a category for this article.You can select only one category.",
                    )
    keyconcepts = models.ManyToManyField(
                    KeyConcept,
                    related_name="keyconcept_blog_set",
                    help_text="Select a key concept for this article. You can select one or more key concepts.",
                    verbose_name="Concetti chiave",
                    )
.....

    def get_absolute_url(self): 
        return reverse("single_blog_post", kwargs={"slug_post": self.slug_post})

В этот ответ объясняется, как можно сделать то же самое, что я пытаюсь сделать, но в моем случае не работают нормально, и я не понимаю, почему.

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

Но, как вы сказали, URL содержит два слага, поэтому вам нужно передать их обоим в обратном вызове.И вам нужно использовать те же имена, которые вы использовали в самом шаблоне URL.

return reverse("single_blog_post", kwargs={"slug": self.slug_post, "slug_category": self.category.slug_category})
0 голосов
/ 17 марта 2019

Благодаря указанию Даниэля Роузмана я решил свою проблему с небольшим дальнейшим изменением.

Это новая функция singlePost:

def singlePost(request, slug_post, slug_category):
    category = get_object_or_404(Category, slug_category=slug_category)
    blogpost = get_object_or_404(BlogPost, slug_post=slug_post)
    category_blogpost = BlogPost.objects.filter(category=category)
    context = {"category": category, "blogpost": blogpost, "category_blogpost": category_blogpost}
    return render(request, "blog/single_post.html", context)

С кодом Даниэля Роузмананиже:

return reverse("single_blog_post", kwargs={"slug_post": self.slug_post, "slug_category": self.category.slug_category})

Теперь я могу использовать двух слагов на моем сайте

...