我已经建立了一个程序(使用Django 1.9)来跟踪比赛。每次比赛都由一系列的回合组成,每个回合都有两个相关的人(战斗员)。
比赛有一个“ combatant_pool”,其中包含所有战斗对象的子集。该界面目前允许我从“ combatant_pool”添加/删除战斗人员。
问题出在屏幕上,它使我可以记录回合。我可以毫无问题地查看/添加/删除/修改动作,但是输入动作的问题在于,允许我选择“战斗员_1”和“战斗员_2”的下拉菜单允许我从数据库中的任何战斗员中进行选择,以及需要什么是只在“combatant_pool”战斗上市。
我浏览了许多其他与此问题相关的论坛,但似乎没有一个可以帮助我解决此问题。
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})
啊,终于找到了可行的解决方案。
我只需要将此方法添加到视图中:
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)
然后添加参数
formfield_callback=get_field_qs
到inlineformset_factory调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句