我正在尝试列出可能属于多个团队的玩家。我为用户设置了我的代码,以便能够选择多个团队,而且工作正常。但是,现在我已经这样做了,字段的自动填充不再有效。它使用外键工作正常但是一旦我将模型字段引用更改为ManyToManyField,我设置的下拉字段的自动填充不再有效。请帮忙!我是一个新手,所以,如果有更好的方式来实现我想要实现的目标,我可以接受其他想法。这是我的代码:
Models.Py
class UserProfile(models.Model):
user = models.OneToOneField(User)
users = User.objects.select_related('userprofile').all()
team = models.ManyToManyField(Team,related_name='teamprofile')
def __str__(self):
return self.user.get_full_name()
class Team(models.Model):
team = models.CharField(max_length=264,unique=True)
user = models.ForeignKey(User,null=True,on_delete=models.CASCADE)
class Meta:
ordering = ["team"]
def __str__(self):
return self.team
Views.Py
def view_byteam(request):
form = ViewByTeam(request.user, request.POST or None)
if request.method == 'POST':
if form.is_valid():
department = form.cleaned_data['dropdown']
return HttpResponseRedirect(team.get_absolute_url1())
return render(request,'/view_byteam.html',{'form':form})
Forms.py
class ViewByTeam(forms.Form):
dropdown = forms.ModelChoiceField(queryset=Team.objects.none())
def __init__(self, user,*args, **kwargs):
super(ViewByTeam, self).__init__(*args, **kwargs)
qs = Team.objects.filter(team=user.userprofile.team)
self.fields['dropdown'].queryset = qs
self.fields['dropdown'].widget.attrs['class'] = 'choices1'
self.fields['dropdown'].empty_label = ''
上面的内容适用于团队中的foreignkey字段引用,但当我将其更改为ManyToMany时,该字段现在为空。我已经尝试将user.userprofile.team更改为user.userprofile.team.all()和user.userprofile.team.all并继续接收我无法解密的错误消息。上面的代码没有返回任何内容,我仍然得到表单,但下拉列表是空白的。好像代码无法再从其个人资料中解密用户团队。我已在其他地方检查过,系统正在考虑团队价值,但出于某种原因无法在我的代码的这一部分中使用它。我试图让它返回多个值,最少至少一个,但它应该能够返回多个值。任何想法都表示赞赏。
答案 0 :(得分:1)
在表单中更改此行。 init ()方法,
qs = Team.objects.filter(team__in=user.userprofile.team.all())
在您将字段更改为ManyToMany
关系后,该属性是对象列表。相应地更改过滤器。
答案 1 :(得分:0)
回答从foreignkey到manytomany更改字段后要更改的内容的原始问题是将我的过滤器从qs = Team.objects.filter(user.userprofile.team)更新为qs = Team.objects.filter(team__in = user.userprofile.team.all())。