2010-01-22 12 views
7

All'interno di un modello di Django sto cercando di chiamare la funzione split su una delle variabili di modello e quindi ottenere l'ultimo elemento, così ho fatto qualcosa di simile:Calling funzione Python in Django modello

{{ newsletter.NewsletterPath.split('/').-1 }} 

Purtroppo , non gli piace la divisione. Alcuni potrebbero suggerire di fare la scissione nella vista, ma non sono sicuro di come farlo perché ho bisogno di farlo per tutti i record. Sarebbe molto più facile se potessi farlo nel modello. C'è un modo per fare questo?

+0

possibile duplicato del [funzione template chiamata di Django] (http://stackoverflow.com/questions/2468804/django-template-call-function) – Marcin

risposta

6

Cosa intendi per "non ti piace lo split"? Come manifesta la sua antipatia?

Se ricordo correttamente, non è possibile passare alcun argomento arbitrario ai metodi, che vengono chiamati dal modello django e gli identificatori, che possono essere utilizzati nei modelli, possono essere costituiti solo da az, AZ, 0-9, caratteri di sottolineatura e punti (dove i punti indicano ricerca: dizionario-> attributo-> metodo-> elenco-indice).

ci sono almeno quattro modi per ottenere ciò che si vuole:

  • rendere i dati in modo appropriato preparati disponibili come un attributo del modello (o qualunque cosa sia), di pre-elaborazione è
  • make i dati disponibili come metodo del modello e assicurarsi che il metodo non prende argomenti richiesti, oltre self
  • popolare le istanze del modello nella vista

    for newsletter in newsletters: 
         setattr(newsletter, 'basepath', 
           newsletter.NewsletterPath.split('/')[-1]) 
    

    (o qualcosa del genere)

  • implementare un tag filtro personalizzato, che gestirà la divisione (più facile, quanto si possa pensare)
7

Dal django book:

Si noti che non si include parentesi nelle chiamate di metodo. Inoltre, non è possibile passare argomenti ai metodi; puoi chiamare solo metodi che non hanno argomenti richiesti.

Quindi, se si desidera chiamare un metodo senza argomenti da un modello, va bene. Altrimenti, devi farlo nella vista.

4

I modelli non sono deliberatamente in grado di eseguire tali operazioni. Lo scopo è quello di evitare che tu inserisca la tua logica di business in modelli, che sono pensati per trattare solo con il layout.

Quindi un possibile modo per farlo è quello di definire una funzione NewsletterPathLastElement (auto) nella tua newsletter modello, e chiamare che dal modello.

0

Sì, come altri hanno detto, non si dovrebbe lo farò davvero nei template.

Ma se si vuole, allora avete bisogno di definire un filtro e caricarlo nel modello e utilizzarlo.