拥有像这样的东西

  • 创建于
  • 创建日期(_D)
  • 修改人_
  • 修改日期

对于很多桌子来说,这是一种非常常见的模式.

1)您可以使用以下命令在model.py中自动设置创建日期(而不是其他日期

创建日期(_D) = models.DateTimeField(auto_now_add=True, editable=False)

2) 您可以在模型中创建/修改日期(但不能由/user创建/修改,因为没有请求上下文).和…在一起

def save(self):
    if self.id:
        self.修改日期 = datetime.now()
    else:
        self.创建日期(_D) = datetime.now()
    super(MyModel,self).save()

3)您可以在admin.py中设置创建/修改日期和日期-但这不处理非管理员更新

def save_model(self, request, obj, form, change):
    if change:
        obj.修改人_ = request.user
        obj.修改日期 = datetime.now()
    else:
        obj.创建于 = request.user
        obj.创建日期(_D) = datetime.now()
    obj.save()

4)最后一个位置是view.py,它可以执行所有4项操作,但不包括管理员更新.

所以现实地说,我们必须让逻辑展开,至少在3&4(或从两者调用的模型上的方法,将被忽略)

有什么更好的方法吗?(我已经使用python/Django几天了,所以很容易遗漏一些显而易见的东西)

  • 您是否可以执行类似@login_Required的操作,例如@AUDIT_CHANGES
  • 您是否可以访问模型中的请求和当前用户,并将逻辑集中在那里?

推荐答案

创建/修改日期现在可以由Django处理,因此它们可以像以下那样实现:

class BaseModel(models.Model):
    created_date = models.DateTimeField(auto_now_add=True)
    modified_date = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

通过将其添加到抽象模型基类中,可以轻松地将其添加到应用程序的所有模型中.

存储用户更难,因为request.user不可用.正如SeanOC提到的,这是web请求和模型层之间的分离.要么一直通过此字段,要么在threadlocal中存储request.user.Django CMS这样做是为了他们的许可系统.

class CurrentUserMiddleware(object):
    def process_request(self, request):
        set_current_user(getattr(request, 'user', None))

而用户跟踪发生在其他地方:

from threading import local
_thread_locals = local()

def set_current_user(user):
    _thread_locals.user=user

def get_current_user():
    return getattr(_thread_locals, 'user', None)

对于非web环境(例如管理命令),必须在脚本开始时调用set_current_user.

Django相关问答推荐

如何在Django中将字段及其数据从一个模型添加到另一个模型?

设置wagail开发环境时出现ImportError:";无法从';wagta.search;";导入名称.

注册新用户时,对象没有属性';is_active';错误:';NoneType';对象没有属性

Django-表单(ModelForm)中的数据不保存在现有数据库中

无法使用 django-filters 进行过滤

Django 相当于子查询

表单集中的每个表单验证

设置 SECURE_HSTS_SECONDS 可以不可逆转地 destruct 您的网站?

如何在 Django ORM 中执行 GROUP BY ... COUNT 或 SUM?

如何在python中遍历httprequest post变量

使用 Python / Django 的 Google API 示例的 Oauth

在 Django 应用程序之间共享模型

如何创建一个在复选框右侧显示复选框标签的 Django 表单?

使用直通模型了解 Django 中的多对多字段

从 django/python 中的 request.POST 检索列表项

如何在不同的元素上添加注释?

django-rest-framework 接受 JSON 数据?

如何获取 pytz 时区的通用名称

何时使用 Django get_absolute_url() 方法?

django用q个对象动态过滤