1

次のようなモデルがあるとします。

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_teamandaway_teamを (現在のドロップダウンではなく) CharFields に変換し、それらを別々のモデルに保ちたいと考えています。これを可能にするために、インライン モデル フォームセットをモデル フォームセットに追加するにはどうすればよいですか?

4

1 に答える 1

0

ゲームには外部キー チームがあるため、インライン モデル フォームセットは機能しません。

inlinemodelformset は、ForeignKey を介して別のモデルに接続されているモデルのフォームのリストを表示できます。たとえば、Ab が B の FK である場合、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')

そして、modelformset がそれを使用するようにします。

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

CharField autocompletionを追加することもできます。

于 2012-08-24T08:48:35.550 に答える