Escrevendo uma template tag em Django
-
05-07-2019 - |
Pergunta
Eu estou tentando personalizar um CMS escritos em Django. Os editores de conteúdo são o suficiente para não flexível, de modo que estou tentando chegar a uma solução melhor.
Sem sobre explicando-lo, eu gostaria que fosse um pouco como django-melhor-pedaços ou django-flatblocks
. Você configura uma região editável inteiramente a partir do modelo. Eu quero ligar estas regiões editáveis ??de uma mistura de cordas e instâncias de objetos. Um exemplo seria ter várias regiões editáveis ??com base em um único produto:
{% block product_instance "title" %}
{% block product_instance "product description" %}
Então, se você tem uma vista com outro produto como product_instance
aqueles dois blocks
iria mostrar dados diferentes. Também gostaria de ver a existência de uso para blocos de todo o site que só atravessar a parte de cordas. Essencialmente, eu gostaria de ser capaz de passar identificadores 1-infinito.
Mas eu estou realmente lutando em duas frentes aqui:
-
Como faço para definir a relação entre o identificador mista eo conteúdo instância "
block
" real? Eu tenho um sentimento contenttypes pode apresentam aqui, mas eu tenho realmente nenhuma idéia de onde começar a procurar! -
E como faço para escrever uma tag para ler a sintaxe e converter esse acima em um objeto para renderização?
Solução
Para isso, você pode criar uma etiqueta de inclusão e usá-lo como:
{% load my_tags %}
{% product bicycle <extra vars ...> %}
Para definir a tag, adicionar ao seu app / templatetags / mytags.py:
@register.inclusion_tag('results.html')
def product(item, *extra):
#maybe repackage extra variables
#and add them to the returned dictionary
item_form = ItemForm(item) #form.ModelForm instance
return {'item': item, 'item_form':item_form, ...}
Em seguida, você precisará de um modelo que retorna HTML para o item:
<h1>{{item.title}}</h1>
{{item_form}}
... add some conditional statements depending on extra vars