Наборы форм Django: инициализация значений для дополнительных полей из списка в наборе форм модели

#django #forms #django-templates #django-forms

#django #формы #django-шаблоны #django-forms

Вопрос:

Я пытаюсь создать форму, которая имитирует представление, чтобы упростить ввод данных. Это таблица результатов, где игроки являются заголовками верхних столбцов, с двумя подзаголовками для каждого игрока. В настоящее время форма генерируется и отправляется корректно, за исключением необходимости использовать сборный способ вставки проигрывателя django. Это текущий HTML-вывод шаблона формы, показывающий пару записей и дополнительные формы (кнопки —— будут одинаковыми для всех строк, как отражено в строках, заполненных набором запросов, и это то, что я хотел бы инициализировать в дополнительных илипри сохранении).

Форма

 class ScoreForm(ModelForm):
    game = IntegerField(widget=HiddenInput())

    class Meta:
        model = Score
        exclude = ['chouette']
        widgets={'score': TextInput(attrs={'size': 6}), 'position': TextInput(attrs={'size':3})}
  

Вид

 def manage_scores(request, chnum=1):    
    chobj = Chouette.objects.get(number = chnum)
    chid = chobj.id
    p_list = Score.objects.filter(chouette = chid).distinct('player').order_by('player').values_list('player', 'player__handle')
    playernum = p_list.count()
    lastgamequery = Score.objects.filter(chouette = chid).latest('game')
    newgame = lastgamequery.game   1
    ScoreFormSet = modelformset_factory(Score, form = ScoreForm, extra = playernum)
    if request.method == "POST":
        formset = ScoreFormSet(request.POST)
        for f in formset:
            f.fields['game'].initial=newgame
        if formset.is_valid():
            newscores = formset.save(commit = False)
            for newscore in newscores:
                newscore.chouette = chobj
                newscore.save()
            return redirect('update', chnum=chnum)
    else:
        formset = ScoreFormSet(queryset = Score.objects.filter(chouette = chid).order_by('game', 'player'))
        for f in formset:
            f.fields['game'].initial = newgame
    return render(request, "manage_scores.html", {'player_list' : p_list, 'formset' : formset, 'newgame' : newgame})
  

И шаблон:

     <form method='post' action=''>
    {% csrf_token %}
    {{ formset.management_form }}
    <table class='table'>
        <thead>
            <tr><th></th>
            {% for player in player_list %}
            <th class="text-center" colspan="2" >{{ player.1 }}</th>
            {% endfor %}
            </tr>
            <tr>
            <th class="text-center">Game</th>
            {% for player in player_list %}
            <th class="text-center">Score</th><th class="text-center">Position</th>
            {% endfor %}
        <tbody>
        {% regroup formset by instance.game as game_list %}
        {% for game in game_list %}
            <tr><td class="text=center">
            {% if game.grouper %}
                {{game.grouper}}
            {% else %}
                {{ newgame }}
            {% endif %}
            </td>
            {% for g in game.list %}
                {{ g.id }}
                {{ g.game }}
                <td class="text-center">{{ g.player }}{{ g.score}}</td>
                <td class="text-center">{{ g.position }}</td>
            {% endfor %}   
        {% endfor %}</tr>
    </table>
    <input type="submit" class="btn btn-default btn-sm" role="button" value="Update" />
</form>
  

{{g.player}}, который в настоящее время находится в шаблоне, позволяет мне протестировать форму, но, очевидно, здесь это не ответ. Перегруппировка работает, чтобы поместить все в нужное место с данными набора запросов, которые передаются в набор форм, но не помогает мне предварительно заполнить дополнительные формы. Любые рекомендации очень ценятся, и безжалостные атаки на остальную часть кода также приветствуются, поскольку я новичок в этом и в значительной степени собрал его вместе с повторными поисками SO.

Ответ №1:

На данный момент я решил проблему, исключив поле player из формы и передав значения player в объект «newscores» таким же образом, как было передано значение chouette. Соответствующий код из представления:

         if formset.is_valid():
            newscores = formset.save(commit = False)
            pid=0
            for newscore in newscores:
                newscore.chouette = chobj
                if newscore.game == newgame:
                    newscore.player = p_obj[pid]
                pid  =1
                newscore.save()