【问题标题】:Django User Fields on Models模型上的 Django 用户字段
【发布时间】:2011-03-02 11:09:38
【问题描述】:

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

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

【问题讨论】:

    标签: django django-admin django-authentication


    【解决方案1】:

    更简单的方法,使用 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

    【讨论】:

      【解决方案2】:

      我认为您应该查看django packages section on versioning。所有这些应用程序都会跟踪您的模型的更改、更改人员以及更改时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-25
        • 1970-01-01
        • 2021-04-15
        • 2019-12-30
        • 1970-01-01
        • 2012-08-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多