J'essaie d'utiliser deux slug pour générer les URL d'un type de message. Mon site est divisé en catégories et chacun d'entre eux a un ou plusieurs messages.

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 que j'utilise

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

urls.py que j'aimerais utiliser

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

Lorsque j'utilise le deuxième couple de chemin, cela me montre ceci:

NoReverseMatch sur / blog / gis /

Inverse pour 'single_blog_post' avec les arguments du mot clé '{' slug_post ':' rete-dei-sottoservizi-quadro-normativo '}' introuvable. 1 motif (s) essayé (s): ['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})

Dans cette réponse est expliqué comment il est possible de faire la même chose que j'essaie de faire, mais pour mon cas, cela ne fonctionne pas bien et je ne comprends pas pourquoi.

1
Massimiliano Moraca 17 mars 2019 à 14:05

2 réponses

Meilleure réponse

Mais comme vous l'avez dit, l'URL contient deux slugs, vous devez donc les transmettre tous les deux dans l'appel inverse. Et vous devez utiliser les mêmes noms que vous avez utilisés dans le modèle d'URL lui-même.

return reverse("single_blog_post", kwargs={"slug": self.slug_post, "slug_category": self.category.slug_category})
2
Daniel Roseman 17 mars 2019 à 17:56

Grâce à l'indication de Daniel Roseman, j'ai résolu mon problème avec un petit changement supplémentaire.

Voici la nouvelle fonction 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)

Avec le code de Daniel Roseman ci-dessous:

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

Maintenant, je peux utiliser deux limaces dans mon site Web

0
Massimiliano Moraca 17 mars 2019 à 20:28