Les demandes de mises en avant sont représentées par l'objet FeaturedRequested qui peut faire référence à différents objets (contenu, sujet du forum...) grâce à la table l'infrastructure des types de contenus. Au lieu d'utiliser seulement un champ models.ForeignKey classique, on utilise un champ virtuel GenericForeignKey qui combine un champ models.ForeignKey pour stocker le type de contenu et un champ models.PositiveIntegerField pour stocker l'objet :
Lorsqu'on supprime un objet en base de données, les conséquences sur les autres objets sont généralement gérés par Django (via l'attribut on_delete sur les champs). Ce n'est pas le cas avec l'infrastructure des types de contenus. Dans notre cas, si un des objets (contenu, sujet du forum...) est supprimé, l'objet FeaturedRequested n'est pas supprimé en base de données et son champ content_object renvoie simplement None. Il faut donc prendre en compte que ce champ peut être nul dans notre code.
Ce n'est pas le cas dans le code de la vue FeaturedRequestedList qui correspond à l'URL /mise-en-avant/unes/requetes/ car cette ligne renvoie une AttributeError lorsque content_object est nul pour l'un des objets :
Les demandes de mises en avant sont représentées par l'objet
FeaturedRequested
qui peut faire référence à différents objets (contenu, sujet du forum...) grâce à la table l'infrastructure des types de contenus. Au lieu d'utiliser seulement un champmodels.ForeignKey
classique, on utilise un champ virtuelGenericForeignKey
qui combine un champmodels.ForeignKey
pour stocker le type de contenu et un champmodels.PositiveIntegerField
pour stocker l'objet :https://github.com/zestedesavoir/zds-site/blob/3505295ff9cf11d4026d9ef9cf2334f16ada8d9a/zds/featured/models.py#L59-L61
Lorsqu'on supprime un objet en base de données, les conséquences sur les autres objets sont généralement gérés par Django (via l'attribut
on_delete
sur les champs). Ce n'est pas le cas avec l'infrastructure des types de contenus. Dans notre cas, si un des objets (contenu, sujet du forum...) est supprimé, l'objetFeaturedRequested
n'est pas supprimé en base de données et son champcontent_object
renvoie simplementNone
. Il faut donc prendre en compte que ce champ peut être nul dans notre code.Ce n'est pas le cas dans le code de la vue
FeaturedRequestedList
qui correspond à l'URL/mise-en-avant/unes/requetes/
car cette ligne renvoie uneAttributeError
lorsquecontent_object
est nul pour l'un des objets :https://github.com/zestedesavoir/zds-site/blob/3505295ff9cf11d4026d9ef9cf2334f16ada8d9a/zds/featured/views.py#L257
À noter qu'il est possible (probable ?) que ce soucis soient présent ailleurs dans le code aussi !
Pour reproduire :