6 votes

Clé étrangère de Django-CMS sur les pages montrant les pages publiées et les brouillons

J'ai récemment effectué une mise à niveau de Django-CMS 2.3.5 vers 2.4.1.

Auparavant, j'avais un modèle comme celui-ci :

from django.db import models
from cms.models.pagemodel import Page

class MyModel(models.Model):
    my_page = models.ForeignKey(Page)

Dans l'administration, cela me permettrait de choisir une page à associer avec MyModel .

Maintenant que j'ai effectué la mise à jour et que j'ai cliqué sur "publier le brouillon" pour toutes mes pages, la même page d'administration affiche deux copies de chaque page dans sa boîte de sélection - une publiée et une brouillon.

Quelques enquête supplémentaire a découvert que le plugin teaser a ajouté ce qui suit dans sa définition pour traiter ce problème :

    page_link = models.ForeignKey(Page,
        limit_choices_to={'publisher_is_draft': True},
        ...)

De même, j'avais l'habitude de pouvoir rechercher les URL des pages dans mes vues comme ceci :

Page.objects.get(reverse_id='update').get_absolute_url()

Mais maintenant je dois utiliser :

Page.objects.get(reverse_id='update', publisher_is_draft=False).get_absolute_url()

Cela semble un peu laid.

Est-ce que les limit_choices_to et le champ supplémentaire dans le get maintenant nécessaire ? Ou existe-t-il un moyen plus propre de ne voir que les pages publiées ? (par exemple, j'ai remarqué que d'autres plugins cms, par exemple link, picture, utilisent des clés étrangères sans une balise limit_choices_to argument.)

7voto

Venelin Stoykov Points 84

Pour une meilleure gestion des clés étrangères aux pages cms, vous devez utiliser PageField au lieu de ForeignKey.

https://django-cms.readthedocs.org/en/2.4.3/extending_cms/fields.html

from django.db import models
from cms.models.fields import PageField

class MyModel(models.Model):
    my_page = PageField()

Lorsque vous voulez obtenir l'url d'une page par son reverse_id, vous devez utiliser la procédure suivante

Page.objects.public().get(reverse_id='update').get_absolute_url()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X