如何使modelformset具有内联modelform?

2024-04-20 05:31:48 发布

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

假设我有这样一个模型:

class Team(models.Model):
    name = models.CharField(max_length=20)

class Game(models.Model):
    title = models.CharField(ma_length=20)
    home_team = models.ForeignKey(Team)
    away_team = models.ForeignKey(Team)

在我看来:

def manage_games(request):
     GameFormSet = modelformset_factory(Game, extra=1)
     game_forms = GameFormSet(request.POST or None,
                                 queryset=Game.objects.all())
     if request.method == "POST":
         if game_forms.is_valid():
            game_forms.save()
            game_forms = GameFormSet(queryset=Game.objects.all())                 

     return render(request, "admin_dashboard/manage_games.html", locals())

这很好用,只是我希望能够将home_teamaway_team转换为CharFields(而不是当前的下拉列表),同时保持它们的独立模型。如何将内联模型表单集添加到模型表单集中以实现这一点?你知道吗


Tags: 模型gamehomemodelmodelsrequestformslength
1条回答
网友
1楼 · 发布于 2024-04-20 05:31:48

inlinemodelformset不起作用,因为游戏有foreignkeys团队。你知道吗

inlinemodelformset可以显示通过ForeignKey连接到另一个模型的表单列表。例如,如果A.b是FK to b,则可以为b生成A的inlinemodelformset

但是,您仍然可以添加几个字段来更改主客场球队名称:

from django import forms

from models import Team, Game    


class GameUpdateForm(forms.ModelForm):
    home_team_name = forms.CharField(max_length=20)
    away_team_name = forms.CharField(max_length=20)

    def save(self):
        obj = super(GameForm, self).save()

        if not obj.home_team_id:
            obj.home_team = Team()
        obj.home_team.name = self.cleaned_data.get('home_team_name')
        obj.home_team.save()

        if not obj.away_team_id:
            obj.away_team = Team()
        obj.away_team.name = self.cleaned_data.get('away_team_name')
        obj.away_team.save()

        return obj
    class Meta:
        model = Game
        exclude = ('home_team', 'away_team')

并让模型组使用它:

GameFormSet = modelformset_factory(Game, form=GameForm, extra=1)

您可能还需要添加CharField autocompletion。你知道吗

相关问题 更多 >