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 withlooping, since you don't know whether database has 1 record or more.