Найти - Пользователи
Полная версия: Как правильно передать большое количество значений в шаблон и обработать их?
Начало » Django » Как правильно передать большое количество значений в шаблон и обработать их?
1
MikaMika
Привет.
Есть модель:
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.
Как вариант в запросе во вьюхе указать, что бы выбирались все непустые поля?
Но как это сделать без указания имени полей?
FishHook
Выбрать в values_list или values, пройтись циклом, отфильтровать все пустое, передать в шаблон. В шаблоне сделать цикл и template filter, принимающий число и словарь и возвращающий значение по ключХ.
MikaMika
Спасибо!
Немного не понял, а зачем это:
FishHook
В шаблоне сделать цикл и template filter, принимающий число и словарь и возвращающий значение по ключХ.
Раз мы уже во вьюхе отфильтровали всё пустое и непустое передали в шаблон.
FishHook
>>> Немного не понял, а зачем это
Я неверно выразился, это альтернативное решение
MikaMika
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()
MikaMika
Пока придумал обходить поля объекта так:
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

Единственный минус, что придётся знать имена необходимых для проверки полей.
FishHook
а зачем select_related если делаешь values? В этом случае в нем нет смысла, т.к. твой запрос превращается в список и дальнейшее обращение к нему, как к объекту QuerySet неактуально.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB