2017-05-18 44 views
0

我該如何獲取用戶的詳細信息以便使用?我知道在視圖中我可以這樣做:Django:請求表單中的request.user

currentUser=request.user

但是,如果我在的形式把它作爲讓我得到以下錯誤「‘請求’沒有定義」。

class SelectTwoTeams(BootstrapForm): 

    currentUser=request.user 

    date_joined = currentUser.date_joined.replace(tzinfo=pytz.utc) 

    timeless30 = datetime.datetime.now() - datetime.timedelta(seconds=3610) 
    timeless30 = timeless30.replace(tzinfo=pytz.utc) 

    if date_joined > timeless30: 
     currentCharities = forms.ModelChoiceField(queryset=Charity.objects.filter(enabled=1), empty_label=None, widget=forms.Select(attrs={"class":"select-format"})) 

    team1 = forms.ModelChoiceField(queryset=StraightredTeam.objects.none(), empty_label=None, 
           widget=forms.Select(attrs={"class":"select-format"})) 
    team2 = forms.ModelChoiceField(queryset=StraightredTeam.objects.none(), empty_label=None, 
           widget=forms.Select(attrs={"class":"select-format"})) 

非常感謝任何幫助提前。

下面顯示了init這種形式只是在它可能有所幫助。我知道如何使用這個部分的kwargs訪問用戶數據:

def __init__(self, *args, **kwargs): 
    user = kwargs.pop('user', None) 
    self.currentSelectedTeam1 = kwargs.pop('currentSelectedTeam1', None) 
    self.currentSelectedTeam2 = kwargs.pop('currentSelectedTeam2', None) 
    self.currentfixturematchday = kwargs.pop('currentfixturematchday', None) 
    self.currentCampaignNo = kwargs.pop('currentCampaignNo', None) 
    super(SelectTwoTeams, self).__init__(*args, **kwargs) 

    cantSelectTeams = UserSelection.objects.select_related().filter(~Q(fixtureid__fixturematchday=self.currentfixturematchday),campaignno=self.currentCampaignNo,) 

    if not cantSelectTeams: 
     queryset = StraightredTeam.objects.filter(currentteam = 1).order_by('teamname') 
    else: 
     queryset = StraightredTeam.objects.filter(currentteam = 1).exclude(teamid__in=cantSelectTeams.values_list('teamselectionid', flat=True)).order_by('teamname') 

    teamsAlreadyPlaying = StraightredFixture.objects.filter(soccerseason=1025, fixturematchday=self.currentfixturematchday, fixturedate__lte = timezone.now()) 
    postponedGames = StraightredFixture.objects.filter(soccerseason=1025, fixturematchday=self.currentfixturematchday,fixturestatus = "P") 

    queryset = queryset.exclude(teamid__in=teamsAlreadyPlaying.values_list('home_team_id', flat=True)).order_by('teamname') 
    queryset = queryset.exclude(teamid__in=teamsAlreadyPlaying.values_list('away_team_id', flat=True)).order_by('teamname') 
    queryset = queryset.exclude(teamid__in=postponedGames.values_list('home_team_id', flat=True)).order_by('teamname') 
    queryset = queryset.exclude(teamid__in=postponedGames.values_list('away_team_id', flat=True)).order_by('teamname') 

    self.fields['team1'].queryset = queryset 
    self.fields['team2'].queryset = queryset 
    self.fields['team1'].initial = self.currentSelectedTeam1 
    self.fields['team2'].initial = self.currentSelectedTeam2 

    self.fields['team1'].label = False 
    self.fields['team2'].label = False 

    date_joined = user.date_joined.replace(tzinfo=pytz.utc) 

    timeless30 = datetime.datetime.now() - datetime.timedelta(seconds=3610) 
    timeless30 = timeless30.replace(tzinfo=pytz.utc) 

    if date_joined > timeless30: 
     self.fields['currentCharities'].label = False 
+0

嘗試發送該請求,在'form.save(請求)'在您的視圖,並覆蓋了'高清保存(自己,用戶):'方法 –

+0

請你詳細說明一下嗎?在我看來,我有︰form = SelectTwoTeams(user = request.user,currentSelectedTeam1 = currentSelectedTeam1,currentSelectedTeam2 = currentSelectedTeam2,currentfixturematchday = fixturematchday,currentCampaignNo = currentCampaignNo) –

回答

4

表單類是在模塊加載時定義的。這意味着你不能設置currentUser = request.user,因爲你還沒有訪問請求對象。您應該從代碼中刪除該行。

正確的做法是覆蓋__init__方法,以便它需要user。如果您的字段定義取決於user,那麼您需要將它們移動到__init__方法中。

class SelectTwoTeams(BootstrapForm): 
    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user') 

     date_joined = self.user.date_joined.replace(tzinfo=pytz.utc) 

     timeless30 = datetime.datetime.now() - datetime.timedelta(seconds=3610) 
     timeless30 = timeless30.replace(tzinfo=pytz.utc) 

     if date_joined > timeless30: 
      self.fields['currentCharities'] = forms.ModelChoiceField(queryset=Charity.objects.filter(enabled=1)) 
     ... 

如果不需要user彈出時,您應該只使用None爲默認值。由於您在__init__方法中訪問self.user.date_joined,因此在您的情況下是必需的。通過將用戶存儲爲self.user,您可以根據需要以其他方法訪問它。

最後,您需要在實例化表單時更改視圖以傳遞用戶。

if request.method == "POST" 
    form = SelectTwoTeams(request.POST, user=request.user) 
    ... 
else: 
    form = SelectTwoTeams(user=request.user) 
+0

我有你的觀點:form = SelectTwoTeams(request.POST,用戶請求=。用戶,currentSelectedTeam1 = currentSelectedTeam1,currentSelectedTeam2 = currentSelectedTeam2,currentfixturematchday = fixturematchday,currentCampaignNo = currentCampaignNo) 我現在擁有這種形式,因爲您擁有它但仍然無法訪問init之外的用戶...任何想法? –

+0

我已經完成了這個工作,但是這些字段是在沒有自我訪問權限的類的根目錄中聲明的。我很欣賞我必須做一些根本性的錯誤,並感謝你的時間。 –

+0

如果字段定義取決於用戶,則需要將其移動到'__init__'方法中。 – Alasdair

0

要獲得表格,你必須經由kwarg參數任何變量然後得到,它在初始化

形式:

class someForm(forms.ModelForm): 
    ...code... 

    def __init__(self, *args,**kwargs): 

     self.Name = kwargs.pop('SomeName') 
在你的看法

yourform = someForm(request.POST or None, initial={'foo': foo}, SomeName= someVar) 
+0

儘量限制依賴關係通常會更好,所以如果需要的實際上是一個'user',那麼只需傳遞一個'user',而不是完整的請求(提示:嘗試爲表單寫一些單位測試... ...「我們會發現只需要傳遞一個'user'而不是一個完整的請求)就容易多了。 –

+0

你是對的,我編輯了答案 – Zartch

+0

另外,一個純粹的'except'子句是一個非常糟糕的主意 - 只會捕獲你期望並願意並且能夠處理的最具體的異常(這裏應該是'except KeyError:') –

0

您可以覆蓋保存方法並在那裏發送請求。

viewys.py

if request.method == "POST" 
    if forms.is_valid(): 
     form.save(request=request.user) 

,並在您forms.py:

def save(self, request=None, *args, **kwargs 
    self.currentUser = request.user 
    super(SelectTwoTeams, self).save(*args, **kwargs) 
    instance.save() 
    return instance