2012-06-02 9 views
5

Есть ли способ иметь случайную строку в шаблоне django?Случайная строка в шаблоне django

Я хотел бы иметь несколько строк, отображающие случайно, как:

{% 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: Спасибо за ответ, но мой случай нужно что-то более конкретного, как это было в базовый шаблоне (которым я забыл упомянуть, извините) , Таким образом, после обхода Google и некоторые док я падаю на контекст процессора статьи Wich сделал свою работу, я нашел его немного «Heavey» в любом случае только для генерации случайного числа ...

здесь страница блога: http://www.b-list.org/weblog/2006/jun/14/django-tips-template-context-processors/

Шаблон тег не сделал трюк (или я не нашел, как), как возвращать тег, который не может быть переведен как я помню (см blocktrans документа)

я не нашел способ создания ряда для базы (есть ли какой-нибудь?), и если есть способ лучше, чем контекстный процесс, я был бы рад иметь некоторые сведения.

ответ

2

Я думаю, вы хотите иметь тег, который генерирует случайные строки из таблицы, содержащей строки. Смотрите этот Джанго фрагмент кода:

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

Вы должны написать собственный шаблонный тег, например, в этом примере (с близкой функциональностью): http://djangosnippets.org/snippets/150/, но если это не так важно, чтобы массив строк в шаблоне, я предпочел бы генерировать эту случайную строку в поле зрения ,

17

Вместо использования if-else блоков, передавая список строк в шаблон и использовать random фильтр кажется лучше

На ваш взгляд:

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

И в вашем шаблоне:

{{ my_strings|random }} 

Here is the doc.

+1

Вы также можете добавить это context_processors и он доступен по всему миру. Хороший совет – zzart

+0

Лучшее решение до сих пор – codingrhythm

13

Вы могли бы сделать что-то вроде этого:

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

Посмотрите на документацию «Встроенные теги шаблонов и фильтров» для получения дополнительной информации: https://docs.djangoproject.com/en/1.4/ref/templates/builtins/

+0

Я полагаю, что это ограничивается только количеством букв в юникоде, но это утверждение 'with' будет действительно очень странным. Это стоит того, чтобы просто сделать так: '{% elif rnd ==" "%}' – mlissner

0

В случае, если вы хотите включить случайный шаблон и есть он доступен по всему миру:

в context_processors:

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

в tempale (давая, что ваш включает в папке 'ИНК'):

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

В шаблоне:

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

В разметке.ру:

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

Взятые из https://djangosnippets.org/snippets/2984/

Смежные вопросы