Уведомления

Группа в Telegram: @pythonsu

#1 Июль 7, 2016 13:02:17

7slon7
Зарегистрирован: 2014-12-16
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

объект из view не отображается в шаблоне

помогите разобраться
есть view.py, который делит участников на две группы и составляет пары из этих групп:

def swiss(request):
    args = {}
    args.update(csrf(request))
    args['index'] = Bill.objects.all()
    args['username'] = auth.get_user(request).username
    nov_por = Bill.objects.filter().order_by('-bill_mat_ozh')
    a = nov_por.count() // 2
    nov_por_1 = (nov_por[:a])
    nov_por_2 = (nov_por[a:])
    res_1 = [(nov_por_1[n].bill_fio) for n in range(nov_por_1.count()) if nov_por_1[n] in nov_por_1]
    res_2 = [(nov_por_2[n].bill_fio) for n in range(nov_por_2.count()) if nov_por_2[n] in nov_por_2]
    players = zip_longest(res_1, res_2)
    args['players'] = players
    for rw_player in players:
        spisok = []
        for one_rw_player in rw_player:
            if one_rw_player == None:
                pass
            else:
                rw_player_name = re.sub(r'[^\w\s-]+', r'', one_rw_player).strip()
                rw_player_id = Bill.objects.get(bill_fio = rw_player_name).id
                spisok.append(rw_player_id)
                spisok.sort()
        print(spisok)
        length = len(spisok)
        if length == 2:
            rival_1 = Bill.objects.get(id = spisok[0])
            rival_2 = Bill.objects.get(id = spisok[1])
            rival_1.swiss_rivel = spisok[1]
            rival_2.swiss_rivel = spisok[0]
            rival_1.save()
            rival_2.save()
        else:
            pass
    return render_to_response('swiss.html', args)

args = players передаю в шаблон, на в шаблоне, объект не отображается, если закоментить все что от
for rw_player in players:
до
return render_to_response('swiss.html', args)
тогда шаблон отрабатывает объект players

кусок из шаблона:
<form action="{% url 'first_step' %}" method="post">
{% csrf_token %}
    <table border="1">
        {% for opponents_player in players %}
            {% if None not in opponents_player %}
                <tr>
                    <td>
                        {% for single_player_if_yes in opponents_player %}
                             {{ single_player_if_yes }} <br>
                        {% endfor %}
                    </td>
                    <td>
                        {% for single_player in opponents_player %}
                            <input type="radio" name="{{ opponents_player }}" value="{{ single_player }}">{{ single_player }} <br>
                        {% endfor %}
                            <input type="radio" name="{{ opponents_player }}" value="no">Ничья<br>
                    </td>
                </tr>
            {% else %}

помогите разобраться, почему в шаблон не хочет отображать данные из объекта players

Офлайн

#2 Июль 7, 2016 14:58:59

7slon7
Зарегистрирован: 2014-12-16
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

объект из view не отображается в шаблоне

методом проб, стала понятна точная причина, не понятна из-за чего
проблема в этом куске:

    for rw_player in players:
        spisok = []
        for one_rw_player in rw_player:
            if one_rw_player == None:
                pass
            else:
                rw_player_name = re.sub(r'[^\w\s-]+', r'', one_rw_player).strip()
                rw_player_id = Bill.objects.get(bill_fio = rw_player_name).id
                spisok.append(rw_player_id)
                spisok.sort()
        print(spisok)
        length = len(spisok)
        if length == 2:
            rival_1 = Bill.objects.get(id = spisok[0])
            rival_2 = Bill.objects.get(id = spisok[1])
            rival_1.swiss_rivel = spisok[1]
            rival_2.swiss_rivel = spisok[0]
            rival_1.save()
            rival_2.save()
        else:
            pass

т.е. в самой вьюхе, если после определения объекта players вставить цикл, то этот объект “теряется”, хотя я его передаю в массив еще до начала цикла, т.е.
args['players'] = players
идет до начала цикла

вопрос остался, в чем дело ? почему так ? как это можно обойти ? что бы объект передать в темплейт и цикл оставить в этой функции во вьюхе

Офлайн

#3 Июль 7, 2016 15:52:31

7slon7
Зарегистрирован: 2014-12-16
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

объект из view не отображается в шаблоне

решил проблему следующим образом:

 ***
    players = zip_longest(res_1, res_2)
    n_players = zip_longest(res_1, res_2)
    for rw_player in n_players:
***
т.е. добавил еще одни объект n_players с точно таким же внутренним содержанием и отправил его в цикл, т.о. у меня получилось два одинаковых объекта, один из которых ушел на вывод в темплейт, другой отрабатывает в теле функции в цикле, причем если присваивать новому объекту значение через n_players = players - не работает
еще изменил вывод на
return render_to_response('swiss.html', {'players':players, 'index':index},
                              context_instance=RequestContext(request))
не нашел объяснения, почему так, если кто-то знает, поделитесь

Отредактировано 7slon7 (Июль 7, 2016 15:53:17)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version