Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Как правильно передать большое количество значений в шаблон и обработать их? [RSS Feed]

#1 Апрель 10, 2013 08:35:43

MikaMika
Зарегистрирован: 2012-11-07
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно передать большое количество значений в шаблон и обработать их?

Привет.
Есть модель:

class Blahblah(models.Model):
    name1 = models.CharField(blank=True)
    name2 = models.CharField(blank=True)
    name3 = models.CharField(blank=True)
    name4 = models.CharField(blank=True)
    describe = models.TextField(blank=True)
    stack = models.IntegerField(blank=True, null=True)
    # и ещё штук 10 разнообразного типа полей.

Во вьюхе делаю запрос для вывода в шаблон:
# Нужны все поля модели.
to_template = Blahblah.objects.all()
# Отдаю на рендер в шаблон.
return render(request, 'mytemplate.html', {'to_template': to_template})

В шаблоне должны выводиться только не пустые поля!
Сейчас это сделано максимально просто.
{% if to_template.name1 %}
            <h5>Name1:</h5>
            <p>{{ to_template.name1|safe }}</p>
            <hr/>
        {% endif %}
{% if to_template.name2 %}
            <h5>Name2:</h5>
            <p>{{ to_template.name2|safe }}</p>
            <hr/>
        {% endif %}
{% if to_template.name3 %}
            <h5>Name3:</h5>
            <p>{{ to_template.name3|safe }}</p>
            <hr/>
        {% endif %}
{% if to_template.name4 %}
            <h5>Name4:</h5>
            <p>{{ to_template.name4|safe }}</p>
            <hr/>
        {% endif %}
{% if to_template.describe %}
            <h5>Describe</h5>
            <p>{{ to_template.describe|safe }}</p>
            <hr/>
        {% endif %}
{% if to_template.stack %}
            <h5>Stack</h5>
            <p>{{ to_template.stack|safe }}</p>
            <hr/>
        {% endif %}

Как можно сократить код?
Или этот вариант правильный?
Мне кажется он не соответствует принципам DRY.
Как вариант в запросе во вьюхе указать, что бы выбирались все непустые поля?
Но как это сделать без указания имени полей?

Отредактировано MikaMika (Апрель 10, 2013 08:37:49)

Офлайн

#2 Апрель 10, 2013 09:06:10

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как правильно передать большое количество значений в шаблон и обработать их?

Выбрать в values_list или values, пройтись циклом, отфильтровать все пустое, передать в шаблон. В шаблоне сделать цикл и template filter, принимающий число и словарь и возвращающий значение по ключХ.



Офлайн

#3 Апрель 10, 2013 09:50:13

MikaMika
Зарегистрирован: 2012-11-07
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно передать большое количество значений в шаблон и обработать их?

Спасибо!
Немного не понял, а зачем это:

FishHook
В шаблоне сделать цикл и template filter, принимающий число и словарь и возвращающий значение по ключХ.
Раз мы уже во вьюхе отфильтровали всё пустое и непустое передали в шаблон.

Отредактировано MikaMika (Апрель 10, 2013 09:50:24)

Офлайн

#4 Апрель 10, 2013 10:20:16

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как правильно передать большое количество значений в шаблон и обработать их?

>>> Немного не понял, а зачем это
Я неверно выразился, это альтернативное решение



Офлайн

#5 Апрель 10, 2013 10:37:22

MikaMika
Зарегистрирован: 2012-11-07
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно передать большое количество значений в шаблон и обработать их?

FishHook, спасибо.
Появилась проблема.
Мой запрос во вьюхе:

q = Blahblah.objects.filter(name1='blahblah').\
        order_by('lalala__name').\
        select_related('fk1', 'fk2').\
        prefetch_related('fk1__source', 'fk2__target')
Когда я делаю:
q.values()
Результат:

'Blahblah' object has no attribute ‘values’

Видимо первый вариант не подходит, когда вытягиваешь связанные таблицы с помощью prefetch_related()

Офлайн

#6 Апрель 10, 2013 11:24:22

MikaMika
Зарегистрирован: 2012-11-07
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно передать большое количество значений в шаблон и обработать их?

Пока придумал обходить поля объекта так:

q = Blahblah.objects.filter(name1='blahblah').\
        order_by('lalala__name').\
        select_related('fk1', 'fk2').\
        prefetch_related('fk1__source', 'fk2__target')
for key, value in q.__dict__.items():
    print key + '//' + value

Единственный минус, что придётся знать имена необходимых для проверки полей.

Офлайн

#7 Апрель 10, 2013 11:29:12

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как правильно передать большое количество значений в шаблон и обработать их?

а зачем select_related если делаешь values? В этом случае в нем нет смысла, т.к. твой запрос превращается в список и дальнейшее обращение к нему, как к объекту QuerySet неактуально.



Офлайн

  • Начало
  • » Django
  • » Как правильно передать большое количество значений в шаблон и обработать их?[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version