以下代码运行良好:
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)
非常感谢,艾伦。
答案 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