При отображении переменных Django ошибка 'Не удалось разобрать остаток'
У меня есть приложение Django, которое предназначено для отображения записей определенных людей. Вместо того, чтобы создавать шаблон для записей каждого человека, я хотел создать одно представление и один шаблон, который может отображать записи разных людей динамически, беря имя человека из переменной, переданной через url. Весь остальной код работает нормально, но когда я отображаю в шаблоне переменные, содержащие информацию о человеке, я получаю такую ошибку:
Не удалось разобрать остаток: '('first_name', flat=True)[0]' из 'modelname.objects.values_list('first_name', flat=True)[0]'
Я храню информацию о людях в нескольких различных моделях, которые содержатся в переменной records в виде списка. Firstname - переменная, содержащая имя, введенное пользователем в url.
Извините, если мой код уродлив. Спасибо за ваше время.
views.py
def records(response, firstname):
#firstname is a variable containing the name entered into the url by the user
#the function will check if a record model with that first name is in records
#records is a list containing all record models
foundmodel = False
for i in range(len(records)):
firstname = firstname[0].upper() + firstname[1:] #Makes first letter uppercase
if firstname == records[i].objects.values_list('first_name', flat=True)[0]:
modelname = records[i]
#modelname will be passed to the template so the correct model can be referenced
foundmodel = True
break
else:
continue
#the loop will keep iterating until a match is found or there are no more record models to try
if foundmodel == True:
return render(response, 'base2.html', {'modelname':modelname})
#the template will be rendered with the information from the correct model if a model with the
#entered name is found
if foundmodel == False:
return HttpResponse('Person does not exist')
#if a model with the entered name is not found, this page will be rendered
релевантный файл base2.html, который будет отображен, если будет найдена модель с выбранным именем
<div class="col-8-xs">
<img style="width:100px; height:100px;" alt="person's picture'" src="#">
<br>
<br>
<br>
<br>
<p>Full Name:{{modelname.objects.values_list('first_name', flat=True)[0]}} {{modelname.objects.values_list('last_name', flat=True)[0]}}</p>
<p>Age:{{modelname.objects.values_list('age', flat=True)[0]}}</p>
<p>Occupation:{{modelname.objects.values_list('occupation', flat=True)[0]}}</p>
</div>
urls.py
from django.urls import path
from app_3 import views
urlpatterns = [
path('home', views.homepage, name='homepage'),
path('base', views.base, name='base'),
path('<str:firstname>/records', views.records, name='records')
]
Вы отображаете логику в шаблоне, которая должна находиться в представлении.
Решение 1 (рекомендуется)
Не уверен, зачем нужно делать все эти values_list(), но, возможно, я что-то упускаю. Если предположить, что ваш класс modelname имеет поля first_name, last_name, occupation, то все, что вам нужно сделать в шаблоне, это:
<p>Full Name:{{ modelname.first_name }} {{ modelname.last_name }}</p>
<p>Age:{{ modelname.age }}</p>
<p>Occupation:{{ modelname.occupation }}</p>
Решение 2
.
Теперь если есть логика, которую вам нужно сделать, напишите ее в ваших представлениях, а затем передайте ее как переменные, как показано ниже (но опять же, я НЕ думаю, что это то, что вам нужно или хочется):
def records(response, firstname):
context = {
'first_name': modelname.objects.values_list('first_name', flat=True)[0]
'last_name': modelname.objects.values_list('last_name', flat=True)[0]
'age': modelname.objects.values_list('age', flat=True)[0]
'occupation': modelname.objects.values_list('occupation', flat=True)[0]
}
return render(response, 'base2.html', context)
А затем обратитесь к этим переменным в вашем шаблоне следующим образом:
<p>Full Name: {{ first_name }} {{ last_name }}</p>
<p>Age: {{ age }}</p>
<p>Occupation: {{ occupation }}</p>