Django表单使用用户ID

时间:2016-08-28 16:22:41

标签: django forms

以下代码运行良好:

class SelectTwoTeams(forms.Form):

    campaignnoquery = UserSelection.objects.filter(user=349).order_by('-campaignno')[:1]

    currentCampaignNo = campaignnoquery[0].campaignno

    cantSelectTeams = UserSelection.objects.filter(campaignno=currentCampaignNo)

    currentTeams = StraightredTeam.objects.filter(currentteam = 1).exclude(teamid__in=cantSelectTeams.values_list('teamselectionid', flat=True))
    team_one = forms.ModelChoiceField(queryset = currentTeams)
    team_two = forms.ModelChoiceField(queryset = currentTeams)

但是,您可以看到用户ID当前被硬编码到过滤器中为349.我希望这是登录用户的ID。我知道在视图中我可以使用:

currentUser = request.user
currentUserID = currentUser.id

但是此代码在表单部分中不起作用。如果有人能指出我理想的正确方向。

当我按照以下建议使用以下表格时,我收到错误消息:NameError:名称'currentUserID'未定义

# coding=utf-8

from dwad.threadlocals import get_current_user

from django.db.models import Max
from django import forms
from straightred.models import StraightredTeam
from straightred.models import UserSelection



class SelectTwoTeams(forms.Form):

    def save(self):

        currentUser = get_current_user()
        currentUserID = currentUser.id

    campaignnoquery = UserSelection.objects.filter(user=currentUserID).order_by('-campaignno')[:1]
    currentCampaignNo = campaignnoquery[0].campaignno

    cantSelectTeams = UserSelection.objects.filter(campaignno=currentCampaignNo)

    currentTeams = StraightredTeam.objects.filter(currentteam = 1).exclude(teamid__in=cantSelectTeams.values_list('teamselectionid', flat=True))
    team_one = forms.ModelChoiceField(queryset = currentTeams)
    team_two = forms.ModelChoiceField(queryset = currentTeams)

非常感谢,艾伦。

2 个答案:

答案 0 :(得分:1)

一种方法是使用local.threading。我已经在许多Django安装上使用了这个解决方案,以便很好地使用。

我知道a number different opinions this is a good or bad是{{3}}解决方案。我倾向于属于在适当的环境下非常好的类别。

要进行设置,请创建名为threadlocals.py的文件:

try:
    from threading import local
except ImportError:
    from django.utils._threading_local import local

_thread_locals = local()

def get_current_user():
    return getattr(_thread_locals, 'user', None)

class ThreadLocalsMiddleware(object):
    def process_request(self, request):
        _thread_locals.user = getattr(request, 'user', None)

然后,将此ThreadLocalsMiddleware课程添加到settings.py中项目的中间件中:

MIDDLEWARE_CLASSES = [
    ...
    'myproject.threadlocals.ThreadLocalsMiddleware',
    ...
]

现在,您需要做的就是从项目的任何位置调用方法get_current_user()

from myproject.threadlocals import get_current_user


class SelectTwoTeams(forms.Form):
    def save(self):
        # for example:
        currentUser = get_current_user()
        currentUserID = currentUser.id

答案 1 :(得分:0)

在Reddit找到了这个答案。 这很简单,在我看来,它运作良好。 在您看来,您必须包含如下代码:

if form.is_valid():
obj = form.save(commit=False)
obj.user = request.user # logged in user is available on a view func's `request` instance
obj.save() # safe to save w/ user in tow