3 回答

TA貢獻(xiàn)1820條經(jīng)驗 獲得超10個贊
如果您希望某些東西在管理員和其他地方都可以使用,則應(yīng)使用自定義模型形式?;舅枷胧侵貙懺揰_init__方法以采用一個額外的參數(shù)-request-并將其存儲為表單的屬性,然后還重寫save方法以設(shè)置用戶ID,然后再保存到數(shù)據(jù)庫。
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貢獻(xiàn)1982條經(jīng)驗 獲得超2個贊
最小的方法是使用a CurrentUserMiddleware將當(dāng)前用戶存儲在線程本地對象中:
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
現(xiàn)在,您只需要將此中間件添加到身份驗證中間件之后的MIDDLEWARE_CLASSES中即可。
settings.py
MIDDLEWARE_CLASSES = (
...
'django.contrib.auth.middleware.AuthenticationMiddleware',
...
'current_user.CurrentUserMiddleware',
...
)
您的模型現(xiàn)在可以使用該get_current_user函數(shù)訪問用戶,而不必傳遞請求對象。
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函數(shù)來檢索當(dāng)前用戶。

TA貢獻(xiàn)1998條經(jīng)驗 獲得超6個贊
Daniel的答案對管理員不會直接起作用,因為您需要傳遞請求對象。您可能可以通過重寫類中的get_form方法來做到這一點,ModelAdmin但遠(yuǎn)離表單自定義并僅重寫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 關(guān)注
- 1246 瀏覽
添加回答
舉報