在Djang中限制内联formset的外键queryset

2024-10-04 01:33:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经建立了一个程序(使用django1.9)来跟踪锦标赛。每一场比赛都由一系列的比赛组成,每一场比赛都有两个人(战斗人员)参与。在

锦标赛有一个“战斗池”,它包含所有战斗对象的子集。该界面目前允许我添加/删除战斗人员从'战斗'池'。在

问题是屏幕让我可以记录比赛。我可以毫无问题地查看/添加/删除/修改阵型,但输入阵型的问题是,下拉列表允许我选择“战斗人员1”和“战斗人员2”,允许我从数据库中的任何战斗人员中进行选择,我需要的是将“战斗人员池”中的战斗人员列出。在

我看过很多其他与这个问题相关的论坛,但似乎没有一个能帮我解决这个问题。在

class combatant(models.Model):
    first_name = models.CharField(max_length=100)

class tournament(models.Model):
    combatant_pool = models.ManyToManyField(combatant, blank=True)

class bout(models.Model):
    parent_tournament = models.ForeignKey(tournament, on_delete=models.CASCADE)
    combatant_1 = models.ForeignKey(combatant, on_delete=models.CASCADE, related_name='combatant1')
    combatant_2 = models.ForeignKey(combatant, on_delete=models.CASCADE, related_name='combatant2')
    outcome = models.CharField(max_length=10)   


def BoutsView(request, pk):
    ThisTournament = tournament.objects.get(id=pk)

    BoutInlineFormSet = inlineformset_factory(tournament, bout, fields=('combatant_1', 'outcome', 'combatant_2'), formset=BaseInlineFormSet)

    if request.method == "POST":
        formset = BoutInlineFormSet(request.POST, request.FILES, instance=ThisTournament)
        if formset.is_valid():
            formset.save()
            # Do something.
            return HttpResponseRedirect('/TournamentTracker/' + str(pk) + '/bouts')
    else:
        formset = BoutInlineFormSet(instance=ThisTournament)

    return render(request, 'tournament_bouts_update_form.html', {'formset': formset, 'pk': pk})

Tags: namemodelonmodelsrequestdeleteclasscascade
1条回答
网友
1楼 · 发布于 2024-10-04 01:33:19

啊,终于找到了一个有效的解决方案。在

我只需将此方法添加到视图中:

    def get_field_qs(field, **kwargs):
        if field.name in ['combatant_1', 'combatant_2']:
            return forms.ModelChoiceField(queryset=Tournament.objects.get(id=pk).combatant_pool)
        return field.formfield(**kwargs)

然后添加参数

^{pr2}$

到inlineformset_factory调用。在

相关问题 更多 >