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