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
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函数来检索当前用户。
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()
- 3 回答
- 0 关注
- 1205 浏览
添加回答
举报