2011-06-09 2 views
0

Bonjour, je travaille sur un blog app et j'ai un modèle:django automatisé terrain dateTime

class Post(models.Model): 
    title = models.CharField(max_length=255) 
    <..> 
    is_published = models.BooleanField(default=False)         
    time_publish = models.DateTimeField() 
    time_edit = models.DateTimeField(auto_now=True) 
    time_create = models.DateTimeField(auto_now_add=True) 

Et je veux définir que, lorsque l'utilisateur définit is_published=True et .save() est appelé alors time_publish ferait gagner du temps en cours. Le problème est que je ne sais pas quelle route je devrais prendre. Remplacer .save() ou faire quelque chose avec des signaux ou quoi? J'apprécierais quelques liens vers Docs. Désolé si c'est dublicable mais je ne savais pas comment la question d'une telle matière devrait être nommée.

Mise à jour:

Ainsi, grâce à Manji i produisais ce code qui fonctionne:

def save(self, *args, **kwargs): 
    if self.pk is not None: 
     orig = Post.objects.get(pk=self.pk) 
     if not orig.time_publish and self.is_published: 
      self.time_publish = datetime.now() 
     elif not self.is_published: 
      self.time_publish = None 
    super(Post, self).save(*args, **kwargs) 
+0

Vous pouvez également définir 'blanc = True, null =' true' pour time_published' si elle va seulement être mis sous condition par 'save()'. –

+0

@Shawn Chin, déjà fait :) merci de remarquer – JackLeo

Répondre

1

La solution la plus simple (et django conforme) est de remplacer la méthode save de votre modèle.

class Post(models.Model): 
    ... 

    def save(self, *args, **kwargs): 
     if self.is_published: 
      self.time_publish = datetime.now() # don't forget import datetime 
     super(Post, self).save(*args, **kwargs) 
     ... 

Plus d'informations ici: Overriding predefined model methods

+0

Ou comme découvert remplacer la méthode 'clean' qui valide les formulaires. Mais sauver serait meilleur endroit je pense – JackLeo

+1

@JackLeo vous ne voudriez pas faire cela dans 'clean()' ou vous pouvez vous retrouver avec des données incohérentes lorsque les modèles sont remplis sans formulaires. –

+0

mais dans ce cas, chaque fois que je modifie un objet, il réécrit la date de publication. Y at-il un drapeau 'est modifié'? – JackLeo