2017-05-18 14 views
1

我拥有以下应有的表单。但是,我希望仅在用户未登录时显示“currentCharities”字段:Django:如果未登录,则显示字段

class SelectTwoTeams(BootstrapForm): 

    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"})) 
    currentCharities = forms.ModelChoiceField(queryset=Charity.objects.filter(enabled=1), empty_label=None, 
               widget=forms.Select(attrs={"class": "select-format"})) 

我已经尝试过很多选项,但没有成功。是否有捷径可寻?非常感谢,艾伦。

下面是表格的其余部分柜面它可以帮助:

def __init__(self, *args, **kwargs): 
    user = kwargs.pop('user') 
    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 
    self.fields['currentCharities'].label = False 

def clean(self): 
    cleaned_data = self.cleaned_data # individual field's clean methods have already been called 
    team1 = cleaned_data.get("team1") 
    team2 = cleaned_data.get("team2") 
    if team1 == team2: 
     raise forms.ValidationError("You may not pick the same teams, please try again.") 

    return cleaned_data 

回答

1

从窗体类中删除currentCharities。在__init__方法,检查user.is_authenticated和创建字段如果用户没有登录。

class SelectTwoTeams(BootstrapForm): 

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

     if not user.is_authenticated: # user.is_authenticated() in Django <= 1.9 
      self.fields['currentCharities'] = forms.ModelChoiceField(queryset=Charity.objects.filter(enabled=1)) 
+0

谢谢,现在一切终于按预期工作。感谢您的耐心。 –

相关问题