Python 筛选窗体使用的Django用户选择字段
我正在做一个艰苦的django项目,我又被卡住了。我在userprofile中有一个名为“部队”的字段:Python 筛选窗体使用的Django用户选择字段,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我正在做一个艰苦的django项目,我又被卡住了。我在userprofile中有一个名为“部队”的字段: class UserProfile(models.Model): scout_username = models.OneToOneField(User, on_delete=models.CASCADE) Group_Choice = Groups.Scout_Groups() troop = models.SlugField(max_length=27, choi
class UserProfile(models.Model):
scout_username = models.OneToOneField(User, on_delete=models.CASCADE)
Group_Choice = Groups.Scout_Groups()
troop = models.SlugField(max_length=27, choices=Group_Choice, default='None', blank=False)
date_of_birth = models.DateField(default=date.today)
def __str__(self):
return '%s'% (self.scout_username)
def create_profile(sender, **kwargs):
if kwargs['created']:
user_profile = UserProfile.objects.create(user=kwargs['instance'])
post_save.connect(create_profile, sender=User)
然后我有一个表单,用于填写发送到stData模型的数据。在表单中,用户可以选择添加其他用户的详细信息。但他们只能向拥有相同部队
详细信息的其他用户添加详细信息。
forms.py
from django import forms
from leaders.models import stData
from django.contrib.auth.models import User
from accounts.models import UserProfileManager, UserProfile
st_username_list=[
(None, 'Choose a user'),
(user1, 'user1'),
(i, 'no progress'),
]
class BadgeForm(forms.ModelForm):
def set_user(self, user):
global st_username_list
troop = user.userprofile.troop
userprofile = UserProfile.objects.all()
selected_st = userprofile.filter(troop=troop)
for st in selected_st:
username = str(st.st_username)
st_username_list.append((username, username))
st_username = forms.ChoiceField(choices=st_username_list)
class Meta:
model = stData
fields = ('st_username', 'Pioneer_Badge', 'Explorer_Badge', 'Adventurer_Badge', 'Proficiency_Badge', 'Other_Badge')
请注意
在上面的示例中,我使用了一个全局变量。我知道这是远远不够的。由于解释了正确的过滤方法(在断线后发现),我已经将其移除。我保存这封信只是为了教育其他可能会发现自己有类似问题的人
我在视图中通过用户,如下所示:
user = request.user
user_form_setting = BadgeForm.set_user(self, user)
models.py
from django.db import models
from django.contrib.auth.models import User
from accounts.st_badge_list import st_List
class stData(models.Model):
Pioneer_Choices = st_List.Target_Badges()
Blue_Choices = st_List.Target_Badges()
Black_Choices = st_List.Target_Badges()
Proficiency_Choices = st_List.Proficiency_Badges()
Other_Choice = st_List.Other_Badges()
Pioneer_Badge = models.CharField(max_length=16, choices=Pioneer_Choices, default='None', blank=True)
Blue_Star = models.CharField(max_length=16, choices=Blue_Choices, default='None', blank=True)
Black_Star = models.CharField(max_length=16, choices=Black_Choices, default='None', blank=True)
Proficiency_Badge = models.CharField(max_length=22, choices=Proficiency_Choices, default='None', blank=True)
Other_Badge = models.CharField(max_length=27, choices=Other_Choice, default='None', blank=True)
st_username = models.ForeignKey(User, on_delete=models.CASCADE)
date = models.DateTimeField(auto_now=True)
print (User)
def __str__(self):
return '%s'% (self.st_username)
我该怎么做才能让所有拥有相同force
详细信息的用户都可以选择显示在st_username_列表中?
在对代码进行研究和尝试之后,我得到了:
ValueError
无法分配“'user1'”:“stData.st\u username”必须是“User”实例。
我希望这不会太令人困惑
编辑 好的,我发现我可以通过执行以下操作过滤st_用户名的选项
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['st_username'].queryset = UserProfile.objects.filter(troop='''user's troop''')
问题更新
我现在的主要问题是无法在模型中传递用户实例。我见过这个。所以我在表单的innit方法中添加了以下内容:
self.user = kwargs.pop('user')
然而,当我尝试通过使用self.user来使用用户时,我得到了一个无用的错误键error,它说user
。外壳表明这可能是由于self.user=kwargs.pop(用户)
我相信这可能是因为我没有通过用户。因此,当我在视图中调用表单时,我尝试了form=BadgeForm(user=request.user)
,但得到了相同的错误
我的queryset现在看起来像这样:
self.fields['scout_username'].queryset=UserProfile.objects.filter(troop=user.userprofile.troop)
更多信息:
为了更好地理解这个问题,我在queryset中传递了一组部队变量。所以在这种情况下
self.fields['scout_username'].queryset=UserProfile.objects.filter(troop='BC')
虽然现在我得到了错误属性错误:
“BadgeForm”对象没有属性“名称”
shell将此链接到我使用表单的表单集。我获得的详细信息如下:
line 435, in formset_factory
return type(form.__name__ + 'FormSet', (formset,), attrs)
我希望这对你比我更有意义!任何帮助都将不胜感激 最后一个问题是表单集的使用。
根据,添加kwargs的正确方法是:
BadgeFormsSet = formset_factory(BadgeForm)
formset = BadgeFormsSet(form_kwargs={'user': request.user})
希望这对其他人有帮助 请不要像那样使用全局变量!当多个请求同时更新同一个全局数据时,您将遇到交叉请求数据“污染”的奇怪情况。对不起,我忘了从我的原始问题中删除它。非常感谢。