Найти - Пользователи
Полная версия: Django: несколько вопрос неосилятора. Как работать со словарём или как избавится от словаря? Как правильно отдать в шаблон кучу информации?
Начало » Django » Django: несколько вопрос неосилятора. Как работать со словарём или как избавится от словаря? Как правильно отдать в шаблон кучу информации?
1 2
UsCr
Здравствуйте. Нужно выводить из БД на страничку список телеканалов с их статусом. Сделал так:
в шаблон передаю словарь такого вида: data{id:info{}}. То есть словарь со словарями. В первом словаре ключ - это id в БД, в словаре, который доступен по этому ключу - вся информация о канале. Конкретный пример:
data{1:{'name':'channelname', 'state':True}}
ну и…так далее.

В шаблоне творится АД:

{% for id,info in data.items %}
        {% if info.state %}
        <tr bgcolor="#9dde8c">
                {% else %}
                <tr bgcolor="#f89090">
        {% endif %}
                ...тут ничего интересного: из info по ключу достаём данные и заполняем таблицу...
{% endfor %}

В целом, хрен бы с ним, но нужно в табличе сортировать всё по id, а оно выводится вразнобой. Да, словарь. Понимаю, тут претензий нет, но как отсортировать словарь внутри шаблона?

Собственно, данные из базы я забираю ещё более диким образом, наверное я просто не умею работать с базой, но…

Вот модель:
class Channels(models.Model):
    name = models.CharField(max_length=100)
    group_name = models.CharField(max_length=100)
    ip = models.TextField(max_length=16)
    port = models.IntegerField(max_length=5)
    screenpath = models.CharField(max_length=900)
    state = models.BooleanField()
    def __unicode__(self):
        return '%s %s %s %s %s %s %s' % (self.id, self.name, self.group_name, self.ip, self.port, self.screenpath, self.state)

Вот функция из viev.py:

def index(request):
    data = {}
    for i in ch.objects.all().order_by('id'):
        info = {}
        raw_data = str(i).split(' ')
        dbid = raw_data[0]
        info['id'] = dbid
        info['name'] = raw_data[1]
        info['group_name'] = raw_data[2]
        info['ip'] = raw_data[3]
        info['port'] = raw_data[4]
        info['screenpath'] = raw_data[5]
        if raw_data[6] == 'True':
            info['state'] = True
        else:
            info['state'] = False
        data[dbid] = info
    t = get_template('index.html')
    html = t.render(Context({'data': data}))
    return HttpResponse(html)


Ещё раз формулирую конкретные вопросы:

Как правильно отдавать шаблону всю кучу данных из базы?
Как работать со словарём в шаблоне? В частности: как отсортировать его по ключу? Или как обойтись без словаря?
fata1ex
1. Забудьте про логику в шаблонах.
2. Почитайте про кастомные теги/фильтры.
3. Если не понравилось, думайте, как обходиться вьюхами, и передавать более простой вариант в шаблон.
4. Почитайте документацию, можно довольно бегло.
UsCr
fata1ex
Спасибо за отклик. А насчет запросов в базу? Так это и должно выглядеть?
fata1ex
Разумеется, нет. Чтобы это понять, достаточно прочитать хотя бы официальный туториал.
FishHook
В очередной раз пропагандирую за отказ от функций-представлений, разумнее удобней и проще юзать классы.
Class Based Views в Джанге - это сила и красота питонячьего кода, у Вас пропадет желание строить велосипеды, я гарантирую это.
ilnur
FishHook
В очередной раз пропагандирую за отказ от функций-представлений, разумнее удобней и проще юзать классы.
Class Based Views в Джанге - это сила и красота питонячьего кода, у Вас пропадет желание строить велосипеды, я гарантирую это.
а не могли бы предоставить пример просто представления, и его замены через то что вы пропагандируете.
или если уже написано, ткните ссылочкой
заранее спасибо
fata1ex
FishHook, не так давно было несколько постов в разных блогах о “за и против” CBV. Есть как плюсы решения, так и минусы, не надо быть столь категоричным :)
Например.

PS. ilnur, неужели сложно набрать в поисковике ‘class based view’, о которых говорилось выше?
FishHook
fata1ex
FishHook, не так давно было несколько постов в разных блогах о “за и против” CBV. Есть как плюсы решения, так и минусы, не надо быть столь категоричным
Например.

PS. ilnur, неужели сложно набрать в поисковике ‘class based view’, о которых говорилось выше?
>>>Есть как плюсы решения, так и минусы, не надо быть столь категоричным
А давайте обойдемся без ссылок на непонятные ресурсы, мы видим кусок кода и видим, что автор намекает на то, что СБВ может вылиться в бОльшее количество ненужного кода. Мы не знаем, какой величины проект пилит автор и какие у него цели вообще. Возникает вопрос к автору, знаком ли он с концепциями ООП?
Если хотите обсудить, расскажите о Вашем личном опыте работы с СБВ и классическими представлениями.
fata1ex
FishHook, опыт у меня небольшой, а вот автору непонятного ресурса я верю, так как периодически вижу его сообщения в django-dev рассылке. Думается мне, он разбирается в концепциях ООП куда лучше нас с вами. Ну и как бы.

А вообще, не стоит воспринимать так всё в штыки. Я лишь предложил пищу для размышлений. Вот ещё чуть-чуть.
FishHook
fata1ex
FishHook, опыт у меня небольшой, а вот автору непонятного ресурса я верю, так как периодически вижу его сообщения в django-dev рассылке. Думается мне, он разбирается в концепциях ООП куда лучше нас с вами. Ну и как бы.

А вообще, не стоит воспринимать так всё в штыки. Я лишь предложил пищу для размышлений. Вот ещё чуть-чуть.
Коллега, какие штыки, о чем Вы?
Я высказываю своё ИМХО,
оно выражается в том, что лично для меня ( а основной мой фреймворк в работе это Django) CBV - это инструмент, который существенно облегчает работу. Абстрагируясь от стартового топика, где топистартер пишет явно какую-то ерунду, в моей практике заведено описывать базовые классы для разных сущностей, а во вьюхах, моделях и формах их наследовать. Я думаю, что это правильно и хорошо.
Мне кажется, конструктивным разговор, в котором есть место прениям. Вы, судя по Вашим постам, хороший специалист. Я хочу быть хорошим специалистом. Давайте обмениваться личным опытом, это хотя бы оживит форум.
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