Django - Esempio di tag modello personalizzato semplice


Answers

HTML in linea nel tag

Se l'HTML è piccolo, questo metodo è più conveniente rispetto alla creazione di un file separato.

Questo esempio determina i collegamenti ai profili utente. Il file templatetags/somemodule.py contiene:

from django import template
from django.template import Template

register = template.Library()

@register.simple_tag(takes_context=True)
def user_link(context):
    return Template('<a href="{% url \'user_detail\' ' +
            'user.id %}">{{ user.username }}</a>').render(context)

Template#render già restituisce una stringa sicura che non è escape XSS. Ad esempio se avessimo fatto solo:

return '<br>'

sarebbe sfuggito. Potresti anche giocare con mark_safe .

Puoi rendere quel tag disponibile su tutte le visualizzazioni con:

TEMPLATES = [
    {
        'OPTIONS': {
            'builtins': [
                'myprojectname.templatetags.somemodule',

in settings.py .

Guarda anche:

Question

Ho utenti , video , argomenti , criteri e valutazioni

  • Un video ha un argomento
  • Un argomento ha criteri
  • Un utente può creare un video per un determinato argomento
  • Un utente può valutare un video su ciascun criterio fornito per l' argomento in questione.

Puoi vedere il mio post originale Django - Rating Model Example DetailView Template per ottenere dettagli sul modello utilizzato

Ho esteso un modello di DetailView basato sul modello video per inserire l'elenco delle classificazioni per il video selezionato per un determinato utente come contesto extra.

class VideoFileDetailView(DetailView):
  model = VideoFile

  def get_context_data(self, **kwargs):
    context = super(VideoFileDetailView, self).get_context_data(**kwargs)
    context['rates'] = VideoRate.objects.filter(video=self.object, user=self.request.user)
    return context

Nel modello puntato da DetailView , vorrei elencare i criteri del video e per ciascun criterio visualizzare il valore di valutazione corrente da parte dell'utente .

<div id="rating">
  <ul>
{% for crit in videofile.topic.crits.all %}
    <li>
  {% for rate in rates %}
    {% if rate.crit.id == crit.id %}
      {{ rate.rate }}
    {% endif %}
  {% endfor %}
      <div class="rateit"
        data-rateit-value="{# The rating value #}"
        data-rateit-ispreset="true"
        crit-id="{{ crit.id }}"></div>
      {{ crit }}
    </li>
{% endfor %}
  </ul>
</div>

( rateit è un plugin jQuery che uso per disegnare i controlli di valutazione delle stelle)

In realtà ottengo i miei valori di valutazione qui entro il 2 °, ma sono sicuro che c'è un modo migliore per farlo. In effetti, non sono ancora sicuro della correttezza del mio modello .

Infine mi piacerebbe sostituire {# The rating value #} per il valore di valutazione da tasso per il critico corrente (nel ciclo). Come lo posso fare ?