#python #django #django-templates
#python #django #django-шаблоны
Вопрос:
У меня есть представление django, которое возвращает этот словарь
args={'Residential': 'N/A', 'School': ('481 address', 600), 'Park': 'N/A', 'Religious': 'N/A', 'Childcare': ('123 address', 5)}
У меня есть этот код, который корректно отображает его на HTML-странице
<h5><b>Nearest Childcare Parcel</b> = {{ Childcare }}</h5>
<h5><b>Nearest Park Parcel</b> = {{ Park }}</h5>
<h5><b>Nearest Religious Parcel</b> = {{ Religious }}</h5>
<h5><b>Nearest Residential Parcel</b> = {{ Residential }}</h5>
<h5><b>Nearest School Parcel</b> = {{ School }}</h5>
это выводит
это нормально, но это уродливо и беспорядочно.
Я хочу красиво поместить его в таблицу.
Итак, вот мой html-код, использующий шаблон django jinja
<div class="container">
<h2>Property Search Results</h2>
<table class="table">
<thead>
<tr>
<th>Layer</th>
<th>Address</th>
<th>Distance to Property</th>
</tr>
</thead>
<tbody>
<tr>
{% if args %}
<td>Childcare</td>
<td>{ args['Childcare'][0] }</td>
<td>{ args['Childcare'][1] }</td>
{% endif %}
</tr>
<tr class="success">
{% if args %}
<td>Park</td>
<td>{ args['Park'][0] }</td>
<td>{ args['Park'][1] }</td>
{% endif %}
</tr>
<tr class="danger">
{% if args %}
<td>Religious</td>
<td>{ args['Religious'][0] }</td>
<td>{ args['Religious'][1] }</td>
{% endif %}
</tr>
<tr class="info">
{% if args %}
<td>Residential</td>
<td>{ args['Residential'][0] }</td>
<td>{ args['Residential'][1] }</td>
{% endif %}
</tr>
<tr class="warning">
{% if args %}
<td>School</td>
<td>{ args['School'][0] }</td>
<td>{ args['School'][1] }</td>
{% endif %}
</tr>
</tbody>
</table>
</div>
ошибок нет, но в таблице вообще ничего не отображается.
Каков наилучший способ заставить это тоже работать? должен ли я выполнять цикл for через словарь args?
это полное представление
class HomePageView(TemplateView):
template_name = 'index.html'
def get(self, request):
cur = conn.cursor()
cur.execute("delete from reporter_post")
form = HomeForm()
#posts = Post.objects.all()
#args = {'form': form, 'posts': posts}
return render(request, self.template_name, {'form': form})
def post(self, request):
form = HomeForm(request.POST)
print(form)
if form.is_valid():
cur = conn.cursor()
cur.execute("delete from reporter_post")
form.save()
g = geocoder.bing(str(form.cleaned_data['address']), key=bingkey)
try:
x,y=g.latlng[1],g.latlng[0]
print(x,y)
pre_qry='''with a as(select parcelid,owner_name,geom
from macomb_parcels_zoning_mun mpzu
where st_intersects(geom,st_transform(st_setsrid(ST_FlipCoordinates(st_makepoint({0}, {1})),4326),102690))
)
update reporter_post set parcelid=a.parcelid, owner_name=a.owner_name,geom=a.geom from a;
'''.format(y,x)
cur.execute(pre_qry)
conn.commit()
qry = '''
with address1 as(select '{0}'::text subject_parcel_address, mpzu.*
from macomb_parcels_zoning_mun mpzu
where st_intersects(geom,st_transform(st_setsrid(ST_FlipCoordinates(st_makepoint({1}, {2})),4326),102690))
),
process
as(select distinct on(zone_from_parcels,subject_parcel_address) zone_from_parcels,subject_parcel_address,buffered_parcel_address,owner_name,dist
from(select aa.address buffered_parcel_address,aa.owner_name,aa.zone_for_buff zone_from_parcels,
round(st_distance(aa.geom,t.geom)::numeric,2 ) dist, t.subject_parcel_address
from mac_parcels_union aa
cross join lateral (
select m.geom,m.subject_parcel_address, mbu.geom geom_buff
from address1 m join mac_buffer_union mbu on st_dwithin(m.geom,mbu.geom,2000)
where mbu.parcelid = aa.parcelid and aa.parcelid <> m.parcelid
)t
group by buffered_parcel_address,owner_name,zone_from_parcels,dist,subject_parcel_address
order by dist) t
order by subject_parcel_address,zone_from_parcels,dist
)
SELECT zone_from_parcels zone_,subject_parcel_address,buffered_parcel_address,owner_name,dist::integer
FROM process
'''.format(str(form.cleaned_data['address']), y, x)
cur.execute(qry)
row=cur.fetchall()
print(row)
if not row:
return render(request, self.template_name, {'form': form,'text': 'N/A'})
else:
zones={'Childcare': 'N/A', 'School': 'N/A', 'Park': 'N/A', 'Residential': 'N/A', 'Religious': 'N/A'}
for x in row:
for k, v in zones.items():
if x[0] == k:
print(k, x[0])
zones[k] = x[2], x[4]
args = {'form': form, 'Residential': zones['Residential'],
'School': zones['School'], 'Religious': zones['Religious'],
'Childcare': zones['Childcare'], 'Park': zones['Park']}
return render(request, self.template_name, args)
print args
except:
args={'Residential': 'N/A', 'School': ('481 address', 600), 'Park': 'N/A', 'Religious': 'N/A', 'Childcare': ('123 address', 5)}
return render(request, self.template_name, args)
Комментарии:
1. Пожалуйста, покажите функцию просмотра. Я подозреваю,
args
что это не контекстная переменная, отправленная в шаблон.2. он жестко запрограммирован для целей тестирования
3. Это нормально, нам просто нужно увидеть функцию просмотра, иначе мы не знаем, как какие переменные получает шаблон и каковы их значения. (У меня есть подозрение, основанное на моем прочтении вашего поста, что ваш
args
представляет собой словарь всех переменных, которые вы предоставляете вrender_template
вызове, который не делаетargs
себя пригодным для использования в шаблоне. Но я не могу знать наверняка, не видя представления.)4. хорошо, он очень большой, но будет публиковать
5. Спасибо — значит, все именно так, как я и подозревал. Вы отправляете
args
dict в шаблон, но"arts"
он не является ключом в нем. Поэтому просто проверьте соответствующую переменную для каждой строки:{% if Childcare %}
и так далее.
Ответ №1:
Проблема в том, что в этом коде:
args = {'form': form, 'Residential': zones['Residential'],
'School': zones['School'], 'Religious': zones['Religious'],
'Childcare': zones['Childcare'], 'Park': zones['Park']}
return render(request, self.template_name, args)
в шаблон не передается вызываемая переменная args
. Переменные, доступные в шаблоне, в точности соответствуют ключам словаря, который вы здесь назвали args
— so form
, School
, Religious
Childcare
и Park
. Шаблон ничего не знает об имени переменной, которое вы решили использовать для самого словаря (на самом деле, нет ничего необычного в передаче здесь словарного литерала вообще без имени переменной — хотя совершенно законно поместить его в переменную, если это удобнее).
Таким образом, условия {% if args %}
всегда интерпретировались как False
, потому что args
не существует, насколько это касается шаблона.
И есть еще одна ошибка, заключающаяся в том, что в языке шаблонов Django, в отличие от самого Python, весь доступ к свойствам любого рода осуществляется через точечную нотацию, никогда с квадратными скобками. Это Childcare[0]
вообще не сработает — вам нужно сделать Childcare.0
вместо этого.
В официальной документации содержится множество информации о языке шаблонов Django.