Как обращаться с formset для нескольких экземпляров? - PullRequest
1 голос
/ 20 мая 2019

Я строю систему матчей для менеджера турнира.У меня есть модель "Match" и модель "Set" (код ниже).Во-первых, я хотел бы иметь форму, которая объединяет все наборы, связанные с одним совпадением, как я могу это сделать?Во-вторых, как я могу справиться с этим, если у меня есть несколько совпадений в моем шаблоне?

models.py

class Match(models.Model):
    isFinished  = models.BooleanField(default=False)
    team1Win    = models.BooleanField(default=False)
    team2Win    = models.BooleanField(default=False)
    phase       = models.ForeignKey(Phase, default=None, on_delete=models.CASCADE)
    teams       = models.ManyToManyField(Team, default=None, blank=True)

class Set(models.Model):
    timeSet     = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
    scoreTeam1  = models.IntegerField(null=True)
    scoreTeam2  = models.IntegerField(null=True)
    match       = models.ForeignKey(Match, default=None, on_delete=models.CASCADE)

models.py

class SetUpdateForm(forms.ModelForm):

    class Meta:
        model = Set
        fields = [
            'scoreTeam1',
            'scoreTeam2',
            'match',
        ]

РЕДАКТИРОВАТЬ: я создал свой набор форм и т. Д. ... Все отлично работает, но я хочу сделать некоторые проверки перед отправкой набора, как я могу это сделать?

1 Ответ

0 голосов
/ 20 мая 2019

Что вы можете сделать, это создать набор inlineformset, который будет сопоставлять Match и весь связанный Set.

Сначала вам понадобится Матч и весь связанный с ним набор:

#I assume you have the match pk from the url
def match_formset_view(request,pk):
    match = get_object_or_404(Match, pk = pk)
    #get all the related Set
    sets = match.set_set.all()
    #create the inline formset
    MatchSetFormset = forms.inlineformset_factory(
        Match,
        Set,
        form=SetUpdateForm,
        min_num=1,
        extra=0,
        can_delete=True
    )

    #populate the formset accordingly
    formset = MatchSetFormset(request.POST or None,instance=match, queryset= sets,prefix='sets')
    #validate the formset
    if formset.is_valid():
        #do something then save
        formset.save()
    else:
        #do other things.

Имейте в виду, что вы не можете сохранить набор форм, если вы сначала не сохранили экземпляр Match (для создания).

...