Django:表单中的 request.user [英] Django: request.user in form

查看:20
本文介绍了Django:表单中的 request.user的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何获取要在 from 中使用的用户详细信息?我知道在视图中我只能做:

How may I get the user details to use within a from? I know in the view I can just do:

currentUser=request.user

但是如果我在表单中使用它,我会收到以下错误'request' is not defined".

But if I use it in the form as so I get the following error "'request' is not defined".

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

非常感谢您提前提供的任何帮助.

Many thanks for any help in advance.

下面显示了此表单的 init 以防万一它可能有所帮助.我知道如何在这部分使用 kwargs 访问用户数据:

Below shows the init of this form just incase it may help. I know how to get access to the user data using kwargs for this part:

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

推荐答案

表单类是在模块加载时定义的.这意味着您不能设置 currentUser = request.user,因为您还没有访问请求对象的权限.您应该从代码中删除该行.

The form class is defined when the module is loaded. That means that you can't set currentUser = request.user, since you don't have access to the request object yet. You should remove that line from your code.

正确的方法是覆盖__init__ 方法,使其接受user.如果您的字段定义依赖于 user,那么您需要将它们移动到 __init__ 方法中.

The correct approach is to override the __init__ method so that it takes the user. If your field definitions depend on the user then you need to move them into the __init__ method.

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

        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,您可以根据需要通过其他方法访问它.

You should only use None as the default when popping if the user is not required. It is required in your case, since you access self.user.date_joined in the __init__ method. By storing the user as self.user, you can access it in other methods if required.

最后,您需要更改视图以在实例化表单时传递用户.

Finally, you need to change your view to pass the user when you instantiate the form.

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

这篇关于Django:表单中的 request.user的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆