Вызов значений из словаря (Джанго) - PullRequest
1 голос
/ 21 декабря 2011

Я довольно новичок в Django, и у меня возникают проблемы с получением значений для загрузки в HTML из словаря, сгенерированного в models.py, который выглядит следующим образом:

>>> generic_id = Generic.objects.get(pk=127)
>>> dict = generic_id._get_dict()
>>> dict  
[{'field__name':'key1', 'value_char':'value1a', 'value_num':'value1'},{'field__name':'key2', 'value_char':'value2a', 'value_num':'value2'},{'field__name':'key3', 'value_char':'value3a', 'value_num':'value3'},{'field__name':'key4', 'value_char':'value4a', 'value_num':'value4'}]
>>> dict[2]['value_num']  
Decimal('value2')
>>> dict[3]['value_char']
'value3a'

Таблица HTML выглядит следующим образом:

<table>
  <tr>
    <td>Description1</td><td>{{value1}}</td>
    <td>Description2</td><td>{{value2}}</td>
    <td>Description3</td><td>{{value3a}}</td>
    <td>Description4</td><td>{{value4}}</td>
  </tr>
  <tr>
    <td>Name: {{ generic.name }}</td>
    <td>E-mail: {{ generic.email }}</td>
    <td>State: {{ generic.state }}
</table>

Код в views.py прямо сейчас выглядит следующим образом:

def query_test(request, generic_id):
    try:
        a = Generic_table.objects.get(pk=generic_id)
    except Generic_table.DoesNotExist:
        raise Http404
    t = loader.get_template('query_test.html')
    c = RequestContext(request, {
             'generic' : a, })
    return HttpResponse(t.render(c))

Может кто-нибудь дать мне несколько советов о том, как (и эффективно) получить соответствующие значенияиз словаря в сгенерированный HTML?

1 Ответ

1 голос
/ 21 декабря 2011

Исходя из того, как ваши объекты выглядят из вашей модели и вашего шаблона, я бы предложил попробовать это:

при условии:

a = Generic.objects.get(pk=generic_id)
# a == {'field__name':'key1', 'value_char':'value1a', 'value_num':'value1'}

views.py

from django.shortcuts import render_to_response, get_object_or_404

def query_test(request, generic_id):
    a = get_object_or_404(Generic, pk=generic_id)

    return render_to_response("query_test.html", a, 
                    context_instance=RequestContext(request))

query_test.html

Name: {{field__name}}
Char: {{value_char}}
Num : {{value_num}}

Ваше представление не показывает, что вы ожидаете более одного объекта, так как вы ищете идентификатор, поэтому ваш шаблон в конечном итоге отформатирует только один объект.

Редактировать : Если вы пытаетесь отобразить список результатов

views.py может выглядеть примерно так:

def query_test(request, generic_id=None):
    if generic_id is not None:
        a = Generic.objects.filter(pk=generic_id)
    else:
        a = Generic.objects.all()

    c = {'generic': a}

    # add some extra values
    c['value1'] = "I am value1"

    # add a whole dictionary of other values
    c.update({'value2': "yay val2", 'value3a': 3, 'value4': "I am 4"})

    return render_to_response("query_test.html", c, 
                    context_instance=RequestContext(request)) 

А твой шаблон что-то вроде:

<table>
<tr>
    <td>Description1</td><td>{{value1}}</td>
    <td>Description2</td><td>{{value2}}</td>
    <td>Description3</td><td>{{value3a}}</td>
    <td>Description4</td><td>{{value4}}</td>
</tr>
{% for item in generic %}
    <tr>
        <td>Name: {{item.field__name}}</td>
        <td>Char: {{item.value_char}}</td>
        <td>Num : {{item.value_num}}</td>
    </tr>
{% endfor %}
</table>

Edit2 : Адресация к странному объекту, который вы отправляете в шаблон

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

1) Исправьте этот объект данных ДО отправки его в шаблон. Я понятия не имею, хотите ли вы, чтобы все элементы в этом списке или просто конкретный элемент.

not_a_generic_id = Generic.objects.get(pk=127)
not_a_dict = not_a_generic_id._get_dict()
dict_that_I_actually_want = not_a_dict[1]
return render_to_response("query_test.html", dict_that_I_actually_want)

2) Отправьте весь этот список в шаблон и зациклите каждый элемент, а затем получите доступ к значениям:

views.py

not_a_generic_id = Generic.objects.get(pk=127)
not_a_dict = not_a_generic_id._get_dict()
c = {"still_not_a_dict": not_a_dict}
return render_to_response("query_test.html", c)

template.html

<table>
{% for actual_dict in still_not_a_dict %}
    <tr>
        <td>Name: {{actual_dict.field__name}}</td>
        <td>Char: {{actual_dict.value_char}}</td>
        <td>Num : {{actual_dict.value_num}}</td>
    </tr>
{% endfor %}
</table>

3) Несмотря на то, что шаблон не позволяет вам на самом деле получить доступ к числовым индексам списков, потому что вы должны сами отсортировать эти данные в представлении ... если вы настаиваете на доступе к определенному индексу этого списка в шаблоне, сделать то же самое, что и # 2 для views.py, но:

template.html

{% for actual_dict in still_not_a_dict %}
    {% if forloop.counter == 1 %}
        {{actual_dict.value_char}}
    {% endif %}
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...