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

我有一个带有created_by字段的模型,该模型链接到标准Django用户模型。保存模型时,我需要使用当前用户的ID自动填充它。我无法在Admin层执行此操作,因为该网站的大部分内容都不会使用内置的Admin。谁能建议我该怎么做?



回首忆惘然
浏览 1126回答 3
3回答

拉莫斯之舞

如果您希望某些东西在管理员和其他地方都可以使用,则应使用自定义模型形式。基本思想是重写该__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

临摹微笑

最小的方法是使用a CurrentUserMiddleware将当前用户存储在线程本地对象中:current_user.pyfrom threading import local_user = local()class CurrentUserMiddleware(object):    def process_request(self, request):        _user.value = request.userdef get_current_user():    return _user.value现在,您只需要将此中间件添加到身份验证中间件之后的MIDDLEWARE_CLASSES中即可。settings.pyMIDDLEWARE_CLASSES = (    ...    'django.contrib.auth.middleware.AuthenticationMiddleware',    ...    'current_user.CurrentUserMiddleware',    ...)您的模型现在可以使用该get_current_user函数访问用户,而不必传递请求对象。models.pyfrom django.db import modelsfrom current_user import get_current_userclass 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函数来检索当前用户。

米琪卡哇伊

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()
打开App,查看更多内容
随时随地看视频慕课网APP