9
votes

Obtenez une URL absolue à Django lorsque vous utilisez des vues basées sur la classe

Bonjour, je migre mon application pour utiliser des vues basées sur la classe au lieu de vues basées sur la fonction. Dans mon ancien code, j'ai pu obtenir l'URL absolue d'un objet lié à une vue de fonction de cette façon:

class CategoryView(ListPosts):
    template_name = "postlist.html"
    context_object_name="posts"
    def get_queryset(self):
         return Post.objects.filter(category__slug=self.kwargs['slug']).order_by('created')


1 commentaires

À quoi ressemble la ligne appropriée dans votre URLCONF? Et quelle erreur Django vous jette-t-elle?


5 Réponses :


24
votes

Vous devez toujours donner à vos URLS un nom et reportez-vous à celui-ci:

@models.permalink
def get_absolute_url(self):
    return ('category_view', (), {'slug': self.slug})


2 commentaires

Selon les documents 1.6, le décorateur de permalien n'est plus recommandé: docs.djangoproject.com/fr/1.6/ref/models/instances/...


Selon les documents Django, vous devez utiliser inverse () docs.djangoproject.com/fr/2.1/ref/models/instances/...



12
votes

Voici mon get_absolute_url Configuration:

urls.py xxx

modèles.py xxx

mon URLS.PY est sous l'application "Produits", donc l'espace de noms d'URL est "Produits: Produit"


2 commentaires

Et si la réégycle n'a pas été nommée comme suit: URL (R '^ Produits / ([\ w \-d \ -_] +) / $', vues.productview.as_view (), nom = 'Produit'), Comment Vous introduiriez le paramètre kwargs? Kwargs = Self.Slug ne fonctionne pas.


@Reveclair kwargs est un dictionnaire d'argument de mot clé, vous ne voudrez donc pas la définir égal à self.slug . Vous pouvez injecter des paramètres dans kwargs comme n'importe quel autre dictionnaire Python. I.e. kwargs ['foo'] = 'bar' . De plus, pour Django, seuls les paramètres d'URL nommés sont injectés dans kwargs , il est donc important de les nommer dans l'URL Regex.



0
votes

Cette fonction a fonctionné pour moi, il utilise plusieurs paramètres: xxx


1 commentaires

Pourriez-vous expliquer pourquoi / comment cela fonctionne? Aussi, sont "chapiter" et "chpiter" censé être "chapitre"?



0
votes

Voici comment vous le faites dans django> = 2.0 .

in urls.py xxx

Ajoutez le code suivant à votre modèles.py xxx

pour afficher le détail, ajoutez une vue générique dans votre vues.py < / code> xxx


0 commentaires

3
votes

La réponse 2018 à cette question est fondamentalement la même chose que @ Aaron's, mais pour un accès rapide ici, c'est le cas: xxx

de https://docs.djangoproject.com/fr/2.1/ref/models/instances/#get-absolu -url


0 commentaires