Django Могу ли я показать одно значение в html без цикла for?

Я хочу отображать данные из представления в html. Это views.py

views.py

def addDeviceForm(request):

    key=request.GET['key']
    device=Device.objects.filter(key=key)
    data = {'device':device}
    return render(request,'add_form.html', data)

Я пытаюсь показать одни данные в html файле, но они не отображаются.

<b>{{ device.key }}</b>

Если я показываю данные с помощью такого кода, то проблем не возникает.

{% for device in device %}
<b>{{ device.key }}</b>
{% endfor %}

Я редактирую views.py следующим образом.

    key="001"
    device=Device.objects.filter(key=key)
    data = {'device':device,'key':key }
    return render(request,'add_form.html', data)

И показать в html следующим образом.

{{ key.key }}

Все еще не показывает значение.

Можно ли показать одно значение в html без цикла for?

В шаблоне

# https://docs.djangoproject.com/en/4.0/ref/templates/builtins/#first
<b>{{ data.first.key }}</b>

ИЛИ

Если вы хотите сделать фильтр, который возвращает n-й элемент вашего объекта, то:

  • В вашем приложении создайте каталог templatetags внутри этого каталога создайте файл __init__.py и файл с любым именем filters.py

В filters.py

from django import template

register = template.Library()


@register.filter
def get_item(myList, index=0):
    """
    Django template filter to get nth item of list
    """
    if index < 0:
        return myList[0]
    else:
        return myList[index]

В шаблоне

Фильтр get_item может быть использован как: filters - имя файла в templatetags

{% load filters %}
<!-- n will be item 0, 1, 2, ... -->
<b>{{ data|get_item:"n" }}
def add_device_form(request):
    key=request.GET['key'] # you should probably use a FORM here 
    # device=Device.objects.filter(key=key) you don't need a queryset
    # and querysets are plural, they are a set of the rows, not a single row
    device = get_object_or_404(Device, key=key) # Throws 404 if obj doesn't exist
    context = {'device':device} 
    return render(request,'add_form.html', context)

метод фильтра класса модели всегда будет возвращать вам набор запросов, а не объект, если вы хотите вернуть объект с помощью метода фильтра, вам следует использовать следующее:

device=Device.objects.filter(key=key).last()

или

device=Device.objects.filter(key=key).first()

таким образом, вы получите последний или первый объект вашего набора запросов, а не его самого.

Yes, you can show one value in html, you must use get()django-doc or better get_object_or_404()django-doc.

views.py

from django.shortcuts import get_object_or_404, render


def addDeviceForm(request):

    key=request.GET['key']
    device=get_object_or_404(Device,any_key_name=key)
    data = {'device':device}
    return render(request,'add_form.html', data)

Затем, в вашем template файле вы получите объект device, в котором вы сможете получить доступ ко всем его свойствам.

Файл шаблона

<b>{{ device.any_key_name }}</b>

Note: filter()djano-doc always returns new QuerySet containing objects that match the given lookup parameters as stated in docs. So, only use it with looping, since you don't know whether database has 1 record or more.

Вернуться на верх