2017-09-08 3 views
0

Ich habe ein Produkt-Stock-Modell wie unten angegeben.django - logging edit event - muss ID des angemeldeten Benutzers

Ich muss die Update-Aktivität für dieses Modell protokollieren, zusammen mit der ID des Benutzers, der es aktualisiert hat.

ACTIONS=(('EC','Edit Category'), 
     ('EG','Edit Group'), 
     ('EP','Edit Product'), 
     ('ES','Edit Stock')) 
class MyLog(models.Model): 
    user=models.ForeignKey(auth.models.User, blank=False) 
    action= models.CharField(max_length=2, choices=ACTIONS, null=False,blank=False) 
    date=models.DateTimeField(blank=False, auto_now=True) 
    data = JSONField() 

Ich habe den folgenden Code zum Stock-Modell hinzugefügt.

def __init__(self, *args, **kwargs): 
     super(Stock, self).__init__(*args, **kwargs) 
     if self.pk != None : 
      self.__important_fields = ['product','date', 'quantity', 'ttype', ] 
      for field in self.__important_fields: 
       setattr(self, '__original_%s' % field, getattr(self, field)) 
       field_name='__original_%s' % field 

    def save(self, *args, **kwargs): 
    if self.pk != None : 
     print("Editing") 
     flag=False 
     log=MyLog(user=?,action='ES') 
     log.data=[] 
     for field in self.__important_fields: 
      original=getattr(self, '__original_%s' % field) 
      if original != getattr(self, field): 
       flag=True 

      log.data.append({field : str(original)}) 

     if flag: 
      log.save() 
    else: 
     print("Adding") 
    super(Stock, self).save(*args, **kwargs) 

Dies funktioniert, wenn ich hart Code ein Benutzerobjekt in die Zeile log = MyLog (user = ?, action = 'ES').

Ich muss die ID des Benutzers protokollieren, der diesen Bearbeitungsvorgang ausgeführt hat.

Wie kann ich das erreichen?

Danke.

+0

Sie die lo geben müssen in einer Benutzer-ID aus einer Ansicht –

+0

Wie mache ich das? – art06

Antwort

0

So habe ich endlich mein Ziel erreicht.

Anstatt das Ereignis vom Modell zu protokollieren, habe ich meinen Code auf umgestellt.

Hier ist mein endgültiger Code.

mylog App Modell

ACTIONS=(('EC','Edit Category'), 
     ('EG','Edit Group'), 
     ('EP','Edit Product'), 
     ('ES','Edit Stock')) 
class MyLog(models.Model): 
    user=models.ForeignKey(settings.AUTH_USER_MODEL, blank=False) 
    model_id=models.IntegerField(default=0) 
    action= models.CharField(max_length=2, choices=ACTIONS, null=False,blank=False) 
    date=models.DateTimeField(blank=False, auto_now=True) 
    old_data = JSONField(default=None) 
    new_data = JSONField(default=None) 

Lager app - Update Ansicht

class UpdateStock(UpdateView): 
    model=Stock 
    form_class=UpdateStockForm 

    def get_form_kwargs(self): 
     kwargs = super(UpdateStock, self).get_form_kwargs() 
     kwargs.update({'user_id': self.request.user.id}) 
     return kwargs 

Lager app - Update-Formular

class UpdateStockForm(forms.ModelForm): 
    def __init__(self,pk= None, *args, **kwargs): 
     self.user_id=kwargs.pop('user_id') 

     super(UpdateStockForm, self).__init__(*args, **kwargs) 
def clean(self): 
     cleaned_data = super(UpdateStockForm, self).clean() 
     quantity = cleaned_data.get('quantity') 
     date= cleaned_data.get('date') 

     priv_quantity=self.instance.quantity 
     priv_date=self.instance.date 

     if priv_quantity!=quantity or priv_date != date: 
      #log! 
     log=MyLog(user=auth.models.User.objects.get(pk=self.user_id),action='ES', model_id=self.instance.id) 
      log.old_data=[] 
      log.old_data.append({'date' : str(priv_date), 'quantity':priv_quantity }) 

      log.new_data=[] 
      log.new_data.append({ 'date' : str(date), 'quantity':quantity }) 

     log.save() 

    return cleaned_data 
Verwandte Themen