шаблон django отображает словарь python в таблице начальной загрузки

#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.