模型上的Django用户字段

时间:2011-03-02 11:09:39

标签: django django-admin django-authentication

我希望我的应用的每个模型都能存储创建其条目的用户。我做了什么:

class SomeModel(models.Model):
    # ...
    user = models.ForeignKey(User, editable = False)

class SomeModelAdmin(admin.ModelAdmin):
    # ...
    def save_model(self, request, obj, form, change):
        # Get user from request.user and fill the field if entry not existing

我的问题:由于有一个完整的用户身份验证和历史应用程序,是否有一种简单的方法(可能更方向或标准化)使用此应用程序的任何功能,而不是对每个模型执行上述过程?

更新

这就是我的所作所为。它对我来说真的很难看。如果有一种聪明的方法,请告诉我。

我在models.py上扩展了我想要的所有模型:

class ManagerLog(models.Model):
    user = models.ForeignKey(User, editable = False)
    mod_date = models.DateTimeField(auto_now = True, editable = False, verbose_name = 'última modificação')
    class Meta:
        abstract = True

在admin.py中,我对以下类做了同样的事情:

def manager_log_save_model(self, request, obj, form, change):
    obj.user = request.user
    return obj

然后,我还需要在每个扩展模型上覆盖save_model:

class ExtendedThing(ManagerLogAdmin):
    # ...
    def save_model(self, request, obj, form, change):
        obj = manager_log_save_model(self, request, obj, form, change)
        # ... other stuff I need to do here

2 个答案:

答案 0 :(得分:3)

更简单的方法,使用save_model

class MyAdmin(admin.ModelAdmin):
    ...
    def save_model(self, request, obj, form, change):
        if getattr(obj, 'author', None) is None:
            obj.author = request.user
        obj.save()

见:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model

答案 1 :(得分:1)

我认为你应该查看django packages section on versioning。所有这些应用都会跟踪您的模型所做的更改,以及何时进行更改。