亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 1249 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號