#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()