2011-12-20 2 views
1

Я довольно новыми для 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?

+0

Какую проблему вы на самом деле иметь? Можете ли вы показать нам свой шаблон? Можете ли вы показать нам какие-либо ошибки, с которыми вы сталкиваетесь? – Marcin

+0

Я не знаю, как настроить его. Я не уверен, как получить значения dict из моего файла models.py, который будет обработан в представлении, а затем отображен в шаблоне. Прямо сейчас html выглядит как таблица, в которой говорится «Описание 1 {{value1}}» и т. Д. –

+0

Я знаю, как заставить его работать с более простыми словарями ["first_name": "Joe", "last_name": "Smith" ]. Я просто не могу понять этот более сложный словарь. –

ответ

1

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

при условии:

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> 

Редактировать2: Обращение к странному объекту, который вы отправляете на ваш templa te

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

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) 

шаблон.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) Даже если шаблон не позволяет фактически получить доступ числовых индексов списков, потому что вы suppost сортировать эти данные из себя с точкой зрения ... если вы настаиваете на доступ к определенному индексу что список в шаблоне, сделать то же самое, как # 2 для views.py, но:

template.html

{% for actual_dict in still_not_a_dict %} 
    {% if forloop.counter == 1 %} 
     {{actual_dict.value_char}} 
    {% endif %} 
{% endfor %} 
+0

Спасибо за помощь. Два типа методов, которые вы объяснили, - это те, которые я выяснил, как это сделать. Возможно, я не объясняю это хорошо, но там, где у меня возникает проблема, вы получаете значения: value1, value2, value3a, value4 в шаблоне. Я смотрю только на одну запись, но она имеет большое количество методов, которые попадают в другие таблицы. Таким образом, dict - это словарь записей из другой таблицы, в которую вы входите. Я редактировал шаблон в вопросе, чтобы включить другие переменные, которые я загружаю. –

+0

@David__ - Хорошо, я только что обновил свой второй примерный раздел в представлении, чтобы показать вам, как добавить больше произвольных значений в контекст, прежде чем отправлять его в шаблон. – jdi

+0

Когда я пытаюсь использовать dict, созданный с помощью c, он отлично работает. Но когда я использую словарь, у которого есть [{xx: x1, yy: y1, zz: z1}, {aa: a1, bb: b1, cc: c1}], я получаю ошибку, что индекс списка должен быть целое число. Это похоже на то, что у меня есть словари, в словаре. Я добавил к своему оригинальному сообщению некоторые результаты из оболочки pythons, что мне нужно сделать, чтобы получить нужные мне результаты. Любые идеи о том, как использовать рабочий питон dict [int] [value_xx], в язык шаблона django. –

Смежные вопросы