2017-09-08 8 views
0

私は以下のような商品在庫モデルを持っています。django - ロギング編集イベント - ログインユーザーのIDを取得する必要があります

TRANSACTION_TYPE=(('I','Stock In'),('O','Stock Out')) 
class Stock(models.Model): 
    product=models.ForeignKey('product.Product', blank=False,null=False) 
    date=models.DateField(blank=False, null=False,) 
    quantity=models.PositiveIntegerField(blank=False, null=False) 
    ttype=models.CharField(max_length=1,verbose_name="Transaction type",choices=TRANSACTION_TYPE, blank=False, db_index=True) 

このモデルの更新アクティビティと、更新したユーザーのIDを記録する必要があります。

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() 

私はストックモデルに次のコードを追加しました。

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) 

これは動作しますが、ときに私のハードコード行のログへのユーザオブジェクト= MyLog(ユーザー= 、アクション= 'ES')。

この編集操作を実行したユーザーのIDを記録する必要があります。

どうすればこの問題を解決できますか?

ありがとうございました。

+0

あなたは、LOを渡す必要がありますビューからユーザーIDを取得します。 –

+0

どうすればいいですか? – art06

答えて

0

私は最終的にどのように私の目標を達成しました。

モデルからイベントをロギングする代わりに、私のコードをフォームに切り替えました。

ここに私の最終的なコードです。

mylogアプリモデル

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) 

株式アプリ - 更新ビュー

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 

株式アプリ - 更新フォーム

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 
関連する問題