2012-06-02 18 views
5

¿Hay alguna forma de tener una cadena aleatoria en una plantilla django?Cadena aleatoria en plantilla django

me gustaría tener múltiples cadenas que muestra al azar como:

{% 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: Gracias por la respuesta, pero mi caso es necesario algo más específico como lo fue en la plantilla base (wich me olvidó mencionar lo siento) . Así que después de arrastrarse Google y algunos doc me quedo en el procesador contexto artículo wich hice el trabajo, me pareció un "del heavey" poco de todos modos sólo para la generación de un número aleatorio ...

aquí es la página del blog: http://www.b-list.org/weblog/2006/jun/14/django-tips-template-context-processors/

etiqueta de plantilla no resolvieron el problema (o no he encontrado la forma), ya que devuelve una etiqueta que no se puede traducir como recuerdo (ver blocktrans doc)

no he encontrado una manera de generar un número para la base ver (¿hay alguno?) y si hay una manera mejor que el proceso de contexto, me gustaría recibir algunas informaciones.

Respuesta

2

Supongo que desea tener una etiqueta que genere cadenas aleatorias de alguna tabla que contenga cadenas. Ver este fragmento de 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

Debe escribir una etiqueta de plantilla personalizada, consulte esta (con funcionalidad cercana) como un ejemplo: http://djangosnippets.org/snippets/150/, pero si no es crítico, a una matriz de líneas en la plantilla, preferiría generar esta cadena aleatoria a la vista .

17

En lugar de utilizar if-else bloques, pasando una lista de cadenas a la plantilla y el uso de random filtro parece mejor

En su opinión:

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

Y en su plantilla:

{{ my_strings|random }} 

Here is the doc.

+1

También puede agregar esto a context_processors y tenerlo disponible a nivel mundial. Buena sugerencia – zzart

+0

La mejor solución hasta el momento – codingrhythm

13

Se podría hacer algo así:

{# 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 %} 

vistazo a la documentación "Built-in etiquetas de plantilla y filtros" para obtener más información: https://docs.djangoproject.com/en/1.4/ref/templates/builtins/

+0

Supongo que esto solo está limitado por el número de letras en Unicode, pero que la declaración 'with' se pondrá muy rara muy rápido. Vale la pena, aunque solo para que podamos tener la declaración '{% elif rnd ==" "%}' – mlissner

0

En caso de que desee incluir plantilla de azar y tenerlo disponible a nivel mundial:

en context_processors:

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

en tempale (dando que su son incluye en la carpeta 'inc'):

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

En una plantilla:

{% 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 }} 

en el marcado.PY:

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

Tomado de https://djangosnippets.org/snippets/2984/