django - 日志编辑事件 - 需要获取登录用户的id

时间:2017-09-08 13:58:15

标签: django logging django-models

我有一个产品库存模型,如下所示。

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

我在Stock模型中添加了以下代码。

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)

当我将用户对象硬编码到行log = MyLog(user = ,action ='ES')时,这是有效的。

我需要记录执行此编辑操作的用户的ID。

我怎样才能做到这一点?

感谢。

1 个答案:

答案 0 :(得分:0)

以下是我最终实现目标的方式。

我没有从模型中记录事件,而是我将代码转换为表单

这是我的最终代码。

mylog app model

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