2012-06-02 15 views
5

C'è un modo per avere una stringa casuale in un modello django?Stringa casuale nel modello django

Mi piacerebbe avere più stringhe che visualizzano in modo casuale come:

{% here generate random number rnd ?%} 

{% if rnd == 1 %} 
    {% trans "hello my name is john" %} 
{% endif %} 

{% if rnd == 2 %} 
    {% trans "hello my name is bill" %} 
{% endif %} 

EDIT: Grazie per la risposta, ma il mio caso necessario qualcosa di più specifico, come è stato nel modello di base (goduto Ho dimenticato di dire mi dispiace) . Così, dopo la scansione di Google e alcuni doc cado sul processore contesto articolo wich fatto il lavoro, l'ho trovato un po ' "heavey" comunque solo per la generazione di un numero casuale ...

Ecco la pagina del blog: http://www.b-list.org/weblog/2006/jun/14/django-tips-template-context-processors/

tag modello non ha fatto il trucco (o non ho trovato il modo), in quanto restituisce un tag che non può essere tradotto come ricordo (vedi blocktrans doc)

non ho trovato un modo per generare un numero per la base vista (c'è qualche?) e se c'è un modo migliore del processo di contesto sarei felice di avere qualche informazione.

risposta

2

Immagino di voler avere un tag che generi stringhe casuali da alcune tabelle contenenti stringhe. Vedere questo frammento di Django:

http://djangosnippets.org/snippets/286/:

# model 
class Quote(models.Model): 
    quote = models.TextField(help_text="Enter the quote") 
    by = models.CharField(maxlength=30, help_text="Enter the quote author") 
    slug = models.SlugField(prepopulate_from=("by", "quote"), maxlength=25) 
    def __str__(self): 
    return (self.quote) 

# template tag 
from django import template 
register = template.Library() 
from website.quotes.models import Quote 

@register.simple_tag 
def random_quote(): 
    """ 
    Returns a random quote 
    """ 
    quote = Quote.objects.order_by('?')[0] 

    return str(quote) 
0

Si dovrebbe scrivere un tag modello personalizzato, vedere questo esempio (con funzionalità close) come esempio: http://djangosnippets.org/snippets/150/, ma se non è critico, per matrice di linee nel modello, preferirei generare questa stringa casuale in vista .

17

Invece di usare if-else blocchi, passando una lista di stringhe per il modello e utilizzando random filtro sembra meglio

Secondo lei:

my_strings = ['string1', 'string2', ...] 
... 
return render_to_response('some.html', {'my_strings':my_strings}) 

E nel modello:

{{ my_strings|random }} 

Here is the doc.

+1

È inoltre possibile aggiungere questo al context_processors e averlo a disposizione a livello globale. Un buon suggerimento – zzart

+0

la soluzione migliore finora – codingrhythm

13

Si potrebbe fare qualcosa di simile:

{# set either "1" or "2" to rnd, "12"|make_list outputs the list [u"1", u"2"] #} 
{# and random chooses one item randomly out of this list #} 

{% with rnd="12"|make_list|random %} 
    {% if rnd == "1" %} 
     {% trans "hello my name is john" %} 
    {% elif rnd == "2" %} 
     {% trans "hello my name is bill" %} 
    {% endif %} 
{% endwith %} 

un'occhiata alla documentazione "Built-in tag di template e filtri" per ulteriori informazioni: https://docs.djangoproject.com/en/1.4/ref/templates/builtins/

+0

Suppongo che questo sia limitato solo dal numero di lettere in unicode, ma che l'istruzione 'with' diventerà davvero strana molto rapidamente. Ne vale la pena anche solo per poter avere la frase '{% elif rnd ==" "%}' – mlissner

0

Nel caso in cui si desidera includere modello casuale e averlo disponibile globalmente:

in context_processors:

def sample(request): 
    my_strings = ['string1', 'string2', ...] 
    return {banners: my_stirngs} 

a tempale (dando che il vostro include sono nella cartella 'inc'):

{% with banners|random as template %} 
    {% include 'inc/'|add:template %} 
    {% endwith %} 
0

In un modello:

{% random_number as rnd %} 
The best 6 digits (by default) random number is: {{ rnd }} 

{% random_number 9 as rnd9 %} 
The best 9 digit random number is: {{ rnd9 }} 

nel markup.py:

@register.assignment_tag() 
def random_number(length=6): 
    from random import randint 
    return randint(10**(length-1), (10**(length)-1)) 

Tratto da https://djangosnippets.org/snippets/2984/