为了账号安全,请及时绑定邮箱和手机立即绑定

Django:保存模型时填充用户ID

Django:保存模型时填充用户ID

回首忆惘然 2019-12-20 11:15:49
我有一个带有created_by字段的模型,该模型链接到标准Django用户模型。保存模型时,我需要使用当前用户的ID自动填充它。我无法在Admin层执行此操作,因为该网站的大部分内容都不会使用内置的Admin。谁能建议我该怎么做?
查看完整描述

3 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

如果您希望某些东西在管理员和其他地方都可以使用,则应使用自定义模型形式。基本思想是重写该__init__方法以采用一个额外的参数-request-并将其存储为表单的属性,然后还重写save方法以设置用户ID,然后再保存到数据库。


class MyModelForm(forms.ModelForm):


   def __init__(self, *args, **kwargs):

       self.request = kwargs.pop('request', None)

       return super(MyModelForm, self).__init__(*args, **kwargs)



   def save(self, *args, **kwargs):

       kwargs['commit']=False

       obj = super(MyModelForm, self).save(*args, **kwargs)

       if self.request:

           obj.user = self.request.user

       obj.save()

       return obj


查看完整回答
反对 回复 2019-12-20
?
临摹微笑

TA贡献1982条经验 获得超2个赞

最小的方法是使用a CurrentUserMiddleware将当前用户存储在线程本地对象中:


current_user.py

from threading import local


_user = local()


class CurrentUserMiddleware(object):

    def process_request(self, request):

        _user.value = request.user


def get_current_user():

    return _user.value

现在,您只需要将此中间件添加到身份验证中间件之后的MIDDLEWARE_CLASSES中即可。


settings.py

MIDDLEWARE_CLASSES = (

    ...

    'django.contrib.auth.middleware.AuthenticationMiddleware',

    ...

    'current_user.CurrentUserMiddleware',

    ...

)

您的模型现在可以使用该get_current_user函数访问用户,而不必传递请求对象。


models.py

from django.db import models

from current_user import get_current_user


class MyModel(models.Model):

    created_by = models.ForeignKey('auth.User', default=get_current_user)

暗示:

如果您使用的是Django CMS,则甚至不需要定义自己的CurrentUserMiddleware,而是可以使用cms.middleware.user.CurrentUserMiddleware和cms.utils.permissions.get_current_user函数来检索当前用户。


查看完整回答
反对 回复 2019-12-20
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

Daniel的答案对管理员不会直接起作用,因为您需要传递请求对象。您可能可以通过重写类中的get_form方法来做到这一点,ModelAdmin但远离表单自定义并仅重写save_model中的方法可能更容易ModelAdmin。


def save_model(self, request, obj, form, change):

    """When creating a new object, set the creator field.

    """

    if not change:

        obj.creator = request.user

    obj.save()


查看完整回答
反对 回复 2019-12-20
  • 3 回答
  • 0 关注
  • 1118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信