2

Je me rends compte que cela a déjà été demandé, mais je n'ai pas réussi à trouver une question qui traite vraiment de ce que j'essaie de faire. Je pense que c'est assez simple, mais j'aimerais savoir ce que la population générale pense être la meilleure forme ici.Les modèles Django surchargés sauvegardent/utilisent un signal/ou utilisent un modelform?

Disons que nous avons les éléments suivants:

models.py

class TestClass(models.Model): 
    user = models.ForeignKey(User) 
    testfield = models.CharField() 
    testbool = models.BooleanField(default=False) 

def save(self, *args, **kwargs): 
    """ 
    - what we're trying to do here is ensure that the User doesn't have more than 
     X (lets say 5) related test fields. 
    - what if we also wanted to add validation to testfield to ensure it was 
     only [a-zA-Z]? 
    """ 
    if TestClass.objects.filter(user=self.user).count() >= 5: 
     # How do we exit gracefully? 
     return 
    super(TestClass, self).save(*args, **kwargs) 

Les commentaires dans la fonction jolie somme beaucoup ma question sauver: - Comment pourrions-nous assurer qu'il n'y a pas plus que 5 TestClass associé à l'utilisateur donneur - Comment pouvons-nous quitter gracieusement d'enregistrer (sans enregistrer) s'il y a déjà 5 - Comment signalons-nous à l'utilisateur? - où validons-nous l'objet testfield pour nous assurer qu'il n'a que [a-z]? puis-je simplement importer re et le faire ici aussi? devrait je?

Est-il préférable de tout jeter ici? Dois-je déclencher un signal pre_save? Ou devrais-je simplement utiliser un ModelForm w/validation?

Répondre

0

Vous avez raison, il n'y a actuellement aucun endroit évident pour le faire. C'est pourquoi un projet Summer of Code est en cours pour ajouter une validation au niveau du modèle, ce qui devrait rendre ce genre de choses facile et agréable.

Malheureusement, il ne sera pas prêt avant plusieurs mois. En attendant, votre réponse dépend de la façon dont les données sont ajoutées. Est-ce que cela sera fait par programme, ou le sera-t-il toujours via un formulaire? Si c'est le cas, mettre la validation dans le formulaire est le chemin à suivre (notez que vous pouvez utiliser le même model model, ou des sous-classes, dans l'admin et dans votre propre vue, donc pas besoin de dupliquer la logique).

+0

Si j'utilise ceci dans l'admin, va-t-il écraser la validation standard que l'administrateur fait (alias blanc = faux, dates correctes, ect.)? Aussi; si je veux surcharger save(), quel est le meilleur moyen de sortir de ça? Je suppose que soulever une exception est probablement mauvais ... alors est-ce que je retourne juste False et ne donne pas une raison? – lostincode

+0

Tant que vous ne redéfinissez aucun des champs réels, la validation par défaut fonctionnera normalement. Pour sauvegarder, il n'a pas besoin de retourner quoi que ce soit, donc il suffit de revenir. –