Django:如果未登录则显示字段

时间:2017-05-18 13:34:22

标签: django django-forms

我有以下表格可以正常工作。但是,我希望展示" currentCharities"仅当用户未登录时才显示字段:

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"}))

我尝试了很多选项而没有成功。是否有捷径可寻?非常感谢Alan。

以下表格的其余部分有助于:

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 个答案:

答案 0 :(得分: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))