Em Django, onde é o melhor lugar para colocar pequenos trechos de dados formatados em HTML?

votos
9

Esta questão está relacionada com (mas talvez não exatamente o mesmo que):

O Django tem ajudantes HTML?

Meu problema é o seguinte: Em Django, estou constantemente reproduzindo a formatação básica para objetos de banco de dados de baixo nível. Aqui está um exemplo:

Eu tenho duas classes, Pessoa e endereço. Existem vários endereços para cada pessoa, likeso configuração (em suas respectivas models.py )

class Person(models.Model):
  ...

class Address(models.Model):
  contact = models.ForeignKey(Person)

Agora, sempre que eu olhar para uma pessoa, eu quero ver todos os seus endereços. Então suponha Pessoas / views.py tem algo likeso:

def detail(request, person_id):
   person = get_object_or_404( Person, pk=person_id )
   return render_to_response('persons/details.html',
      { 'title' : unicode(person), 'addresses': person.address_set.all() } )

E, eu tenho um modelo, pessoas / details.html , com código, por exemplo, como-assim:

{% extends base.html %}

{% for address in addresses %}
<b>` address`.`name `</b>
  ` address`.`type ` <br>
  ` address`.`street_1 `<br>
  ` address`.`street_2 `<br>
  ` address`.`city ` ` address`.`stateprov ` ` address`.`postalcode `<br>
  ` address`.`country `
  <hr>
` endfor `

Estou repetindo este código um pouco, muitas vezes com pequenas variações, como quando está em uma mesa, e, em seguida, <br> deve ser substituído por </ td> <td>. Outras vezes, eu não quero um Street_2 para exibir (ou do <br> depois dela). Tudo para dizer, não há lógica fundamental que quero expressar, que eu sou ainda mais relutantes em bolsa em torno de com o bloco-e-copy!

O que eu quero é uma pessoas / details.html com, por exemplo, o seguinte:

{% extends base.html %}
{% for address in addresses %} 
  {% address.as_html4 %}
{% endfor %}

E se eu quiser tabela embutida, algo likeso (eu acho!):

{% extends base.html %}
<table><tr>
{% for address in addresses %}
  <tr><td> {% address.as_html4 </td><td> %} </td></tr>
{% endfor %}
</table>

A questão é, então: Onde é o melhor lugar para colocar a formatação? A lógica?

Django parecem ter as seguintes opções (plausíveis):

  1. Coloque a formatação no models.py

  2. Coloque a lógica / formatação em views.py

  3. Coloque a lógica / formatação em alguma outra sub-classe de Pessoa ou o endereço (ou seja, endereços / html4.py)

  4. Criar marcas personalizadas

Ajuda / visão muito apreciada!

Publicado 28/09/2008 em 22:31
fonte usuário
Em outras línguas...                            


3 respostas

votos
13

Soa como um tag de inclusão é o que você está procurando. Você poderia ter um modelo e tag para cada grande variação e usar argumentos da tag para personalizar o contexto para cada modelo, conforme necessário.

definição básica tag:

@register.inclusion_tag('person/address.html')
def display_address(address):
    return {'address': address}

Usar em modelos (assumindo que o módulo templatetag contendo já foi {% load %}-ed):

{% display_address address %}
Respondeu 28/09/2008 em 22:53
fonte usuário

votos
2

Gostaria de usar um tag saída de dados usando um html-arquivo de modelo aka inclusão-tag

Respondeu 28/09/2008 em 22:52
fonte usuário

votos
1

Acho filtro modelo será útil também. Você pode passar filtro em cada objeto, por exemplo:

{{ value|linebreaks }} # standard django filter

Vai produzir:

If value is Joel\nis a slug, the output will be <p>Joel<br>is a slug</p>.

Veja Django Built-in template tags e filtros de referência completa.

Respondeu 30/09/2008 em 14:26
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more