Bonjour à tous. Je débute sur django (mais je me débrouille en Python).
Mon souci: j'ai un modèle avec un champ déclaré unique. Toutefois j'ai surchargé la méthode save() pour que si on entre une valeur déjà existante, la valeur soit automatiquement changée. Ca marche parfaitement quand je l'appelle en test direct.
Maintenant j'intègre mon modèle dans la partie admin via @admin.register. Et quand je veux tester, là ça ne marche pas. A ce qui semble, le formulaire détecte que la valeur que je rentre est déjà présente et refuse donc d'appeler le save de mon modèle.
Et donc je me dis que peut-être il y aurait moyen de contourner. Soit en surchargeant la méthode appelée par le formulaire (sauf que je ne sais pas laquelle il s'agit), soit demander au module d'admin de ne pas contrôler ce champ.
Voici le modèle
Code python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 class Chapitre(models.Model): titre = models.CharField(max_length=50, null=False, blank=False, unique=True) slug = models.SlugField(max_length=50, null=False, blank=False, unique=True) order = models.PositiveSmallIntegerField(null=False, blank=True, unique=True) description = models.TextField(null=True, blank=True, default=None) def __str__(self): return "%s (%d)" % (self.titre, self.order) def save(self, *args, **kwargs): self.slug = slugify(self.titre) # Vérifier si numéro d'ordre déjà pris print("ici") previous=Chapitre.objects.all() final=len(previous)+1 for p in previous: if p.order == self.order: p.order=final super(Chapitre, p).save(*args, **kwargs) break # if else: self.order=final super().save(*args, **kwargs) # save() # class Chapitre
Et son homologue d'admin
Code python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 @admin.register(models.Chapitre) class Chapitre(admin.ModelAdmin): list_display = ('__str__', 'titre', 'order', 'description') list_editable = ('titre', 'order', 'description') fields = (('titre', 'order'), 'description') ordering = ('order',) # class Chapitre
Après peut-être que je pars dans un problèmeXY et dans ce cas merci de me recadrer. Mon idée c'est que si l'administrateur crée deux chapitres avec le même "order", le premier chapitre créé parte à la fin (son order devient la valeur la plus élevée) tandis que le second chapitre le remplace dans la liste. C'est le but de la boucle placée dans le save() permettant de trouver un order déjà existant et si c'est le cas, le changer avant d'enregistrer le chapitre en cours.
Merci de votre attention.
Partager