第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

Django:保存模型時填充用戶ID

Django:保存模型時填充用戶ID

回首憶惘然 2019-12-20 11:15:49
我有一個帶有created_by字段的模型,該模型鏈接到標(biāo)準(zhǔn)Django用戶模型。保存模型時,我需要使用當(dāng)前用戶的ID自動填充它。我無法在Admin層執(zhí)行此操作,因為該網(wǎng)站的大部分內(nèi)容都不會使用內(nèi)置的Admin。誰能建議我該怎么做?
查看完整描述

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


查看完整回答
反對 回復(fù) 2019-12-20
?
臨摹微笑

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)前用戶。


查看完整回答
反對 回復(fù) 2019-12-20
?
米琪卡哇伊

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()


查看完整回答
反對 回復(fù) 2019-12-20
  • 3 回答
  • 0 關(guān)注
  • 1246 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號