【问题标题】:Django filter form field by Foreign KeyDjango通过外键过滤表单字段
【发布时间】:2014-09-21 12:28:37
【问题描述】:

我正在尝试过滤表单选择,以便用户只能从某些比赛中选择球员。我已将_init_ 函数更改为如下形式,但没有任何变化

forms.py

from django.forms import ModelForm
from matchdaycentremodel.models import FantasyTeam
from playerteamstats.models import Player

class FantasySeasonForm(ModelForm):
    class Meta:
        model = FantasyTeam

    def _init_(self,*args,**kwargs):
        super(FantasySeasonForm,self)._init_(**kwargs)
        self.fields['player1'].queryset = playerteamstats.models.Player.objects.filter(team__competition__pk=2)

相关模型是..

models.py(玩家团队统计数据)

class Competition(models.Model):
    COMP_ID = models.AutoField(primary_key=True)
    season = models.ForeignKey(Season) #Foreign Key
    competition_id = models.IntegerField()
    competition_name = models.CharField(max_length=200)
    competition_code = models.CharField(max_length=6)

    def __str__(self):
        return '%s (%s)' % (self.competition_name, self.season.season_id) #e.g. 'English Barclays Premier League (2014)'

class Team(models.Model):
    team_id = models.IntegerField(primary_key=True)
    competition = models.ForeignKey(Competition) #Foreign Key
    team_name = models.CharField(max_length=200)
    def __str__(self):
        return self.team_name

class Player(models.Model):
    player_id = models.IntegerField(primary_key=True)
    team = models.ForeignKey(Team) #Foreign Key
    player_name = models.CharField(max_length=140)
    def __str__(self):
        return self.player_name

models.py (matchdaycentremodel)

class FantasyTeam(models.Model):
    FANTASY_TEAM_ID = models.AutoField(primary_key=True)
    player1 = models.ForeignKey(Player, related_name='player1')
    player2 = models.ForeignKey(Player, related_name='player2')
    player3 = models.ForeignKey(Player, related_name='player3')

views.py

@login_required
def entry(request):
    fantasyTeamForm = FantasySeasonForm() #Form to store each player in the fantasy team

    if request.method == 'POST':
        fantasyTeamForm = FantasySeasonForm(request.POST or None)   
        fantasyTeamForm.fields
        if fantasyTeamForm.is_valid():           
            fantasyTeamForm.save()            
            return HttpResponseRedirect('/season/entrysuccess') #page on success


    args = {}
    args.update(csrf(request))

    args['form'] = fantasyTeamForm

    return render_to_response('entry.html', args, context_instance=RequestContext(request))

如何过滤表单的 player1 使其只能从某个比赛中选择?

【问题讨论】:

    标签: django django-forms django-views


    【解决方案1】:

    您的init 被定义为def _init_ 而它应该是def __init__(双下划线)

    另外,正如 crodes 所提到的,您应该执行以下操作:

    self.fields['player1'].queryset = Player.objects.filter(team__competition_id=2)
    

    这没有引发异常的原因是,这些代码行从未执行过。

    【讨论】:

      【解决方案2】:

      如果你的import语句是正确的,应该

      self.fields['player1'].queryset = playerteamstats.models.Player.objects.filter(team__competition__pk=2)
      

      不是

      self.fields['player1'].queryset = Player.objects.filter(team__competition__pk=2)
      

      【讨论】:

      • 仍然没有区别,只是显示所有玩家:'(
      猜你喜欢
      • 2020-10-08
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 2021-12-09
      • 2021-07-02
      • 2021-06-07
      • 2018-12-13
      相关资源
      最近更新 更多