2013-01-09 5 views
2

Il est possible de mettre à jour un champ de modèle dans la méthode save()?Django - Comment mettre à jour un champ dans une méthode save()?

models.py:

class BicycleAdItemKind(MPTTModel): 

    image_file_temp_fullpath = "" 
    image_file_temp_filename = "" 

    def url(self, filename): 
     #pdb.set_trace() 

     #url = "MultimediaData/HelpAdImages/ItemKind/%s/%s" % (self.id, filename) 
     url = "MultimediaData/HelpAdImages/ItemKind/Temp/%s" % (filename) 
     self.image_file_temp_fullpath = url 
     self.image_file_temp_filename = filename 
     return url 

    def item_kind_image(self): 
     return '<img align="middle" src="/media/%s" height="60px" />' % self.image 
    item_kind_image.allow_tags = True  

    n_item_kind  = models.CharField(max_length=50) # Bicicleta completa, Componentes para bicicleta, Acessorios para ciclista 
    parent   = TreeForeignKey('self', null=True, blank=True, related_name='children') 
    description  = models.TextField(null=True, blank=True) 
    image   = models.ImageField(upload_to=url, null=True, blank=True) 
    date_inserted = models.DateTimeField(auto_now_add=True) 
    date_last_update = models.DateTimeField(auto_now=True) 

    def save(self, *args, **kwargs): 
     if not self.id: 
      BicycleAdItemKind.tree.insert_node(self, self.parent) 
     super(BicycleAdItemKind, self).save(*args, **kwargs) 

     pdb.set_trace() 
     # I will move the file from "Temp" folder to the folder with the "Id" number 
     from django.core.files.move import file_move_safe 
     src = settings.MEDIA_ROOT + "/" + self.image_file_temp_fullpath 
     dst = settings.MEDIA_ROOT + "/" + "MultimediaData/HelpAdImages/ItemKind/%s/%s" % (self.id, self.image_file_temp_filename) 
     new_directory = settings.MEDIA_ROOT + "/MultimediaData/HelpAdImages/ItemKind/%s" % (self.id) 
     if not os.path.exists(new_directory): 
      os.makedirs(new_directory) 

      if file_move_safe(src, dst): 
       # I will update the field image 
       BicycleAdItemKind.objects.filter(pk=self.id).update(image=dst) 
       # Delete the Temp file 

    def __unicode__(self): 
     return self.n_item_kind 

    class MPTTMeta: 
     order_insertion_by = ['n_item_kind'] 

La ligne de code ci-dessous ne fait pas toute action,

BicycleAdItemKind.objects.filter(pk=self.id).update(image=dst) 

Il est possible de faire une mise à jour dans une méthode de sauvegarde?

Donnez-moi quelques indices.

Cordialement,

Répondre

0

Avez-vous essayé de vérifier pour voir ce que dst est lorsque vous exécutez la mise à jour? Pourquoi ne pas le faire comme ça?

self.image=dst 
+0

J'ai testé, avec "self.image = dst" mais l'image de champ n'a pas la valeur de "dst". la chose étrange est qu'il n'y a pas d'erreur. Des indices? –

+0

Que se passe-t-il lorsque vous vérifiez la ligne dans la base de données? – girasquid

0

Déplacez le super enregistrement jusqu'à la fin de save() afin qu'il mette à jour le modèle après avoir apporté vos modifications.

def save(self, *args, **kwargs): 
    if not self.id: 
     BicycleAdItemKind.tree.insert_node(self, self.parent) 

    pdb.set_trace() 
    # I will move the file from "Temp" folder to the folder with the "Id" number 
    from django.core.files.move import file_move_safe 
    src = settings.MEDIA_ROOT + "/" + self.image_file_temp_fullpath 
    dst = settings.MEDIA_ROOT + "/" + "MultimediaData/HelpAdImages/ItemKind/%s/%s" % (self.id, self.image_file_temp_filename) 
    new_directory = settings.MEDIA_ROOT + "/MultimediaData/HelpAdImages/ItemKind/%s" % (self.id) 
    if not os.path.exists(new_directory): 
     os.makedirs(new_directory) 

     if file_move_safe(src, dst): 
      # I will update the field image 
      BicycleAdItemKind.objects.filter(pk=self.id).update(image=dst) 
      # Delete the Temp file 

    super(BicycleAdItemKind, self).save(*args, **kwargs) 
Questions connexes