django模板从包含的文件中获取随机行的最佳方法

django模板从包含的文件中获取随机行的最佳方法,django,django-templates,Django,Django Templates,我想在我的基本模板中添加一个随机标语。我意识到实现这一点的简单方法是使用带有我口号的db表,随机获得一个,然后将其传递给模板 问题是,我如何在不使用db的情况下实现它?在我的基本模板中,我希望包含一个包含一堆标语的文件,每行一个,并让模板随机选择一个。我知道随机过滤器将从列表中选择一个随机值,因此,不知何故,我需要包含标语文件,但作为列表。我看到两个选项: 1使用上下文处理器加载此随机引用,即从平面文件加载,然后插入上下文。例如: # create your own context-proces

我想在我的基本模板中添加一个随机标语。我意识到实现这一点的简单方法是使用带有我口号的db表,随机获得一个,然后将其传递给模板

问题是,我如何在不使用db的情况下实现它?在我的基本模板中,我希望包含一个包含一堆标语的文件,每行一个,并让模板随机选择一个。我知道随机过滤器将从列表中选择一个随机值,因此,不知何故,我需要包含标语文件,但作为列表。

我看到两个选项:

1使用上下文处理器加载此随机引用,即从平面文件加载,然后插入上下文。例如:

# create your own context-processor file (myutils/context_processors.py)
def my_random_quote_processor(request):
    context = {}

    # generate your string you want in template
    # ....
    context['RANDOM_QUOTE'] = my_random_quote

    return context


# in settings.py, tell django to include your processor
TEMPLATE_CONTEXT_PROCESSORS = (
    # ...,
    'myutils.context_processors.my_random_quote_processor'
)


# in your base template, just include the template var
<p>quote: {{ RANDOM_QUOTE }}</p>


# make sure in your views, you set the context_instance
def my_view(request):
    # ...
    return render_to_response('myapp/mytemplate.html', c, 
                              context_instance=RequestContext(request))

2创建一个自定义模板标记,从平面文件加载报价,等等:

我会投票支持模板标记。将随机引用存储在文本文件中,每个引用位于单独的行上。然后,在模板标记中,随机读取一行,这里有一个很好的解释,说明如何执行此操作: . 转载如下:

最后返回行,以便模板标记可以打印出来


如果你的口号库很小,你可以使用pickle模块。 像正常的名单一样管理你的基地。


但我认为最好的解决方案是将您的标语数据库保存在real db中

刚刚发现这段代码:
我会解决的

您希望在数据库上使用平面文件有什么特别的原因吗?口号很少改变,而且只有很少几个。即使使用db缓存,创建和维护一个单独的应用程序,或者弄脏一个不相关的现有应用程序,以便在每个页眉上放一个句子,似乎也是一个不必要的复杂问题。对我来说,合乎逻辑的地方应该是包含在base.html模板中的my header.inc。我的想法是,如果有一个函数随机选择标语,那么数据库处理标语的效率将比使用平面文件高出很多。我知道对数据库的调用可以缓存,但是对你的口号的调用可以吗?你能更具体一点吗?如何使用模板中的pickle?似乎我仍然需要将一个pickle列表传递给模板,在这一点上,我可以传递一个常规列表并使用随机过滤器。谢谢,如果我使用这种手动读取文件的方法,这似乎应该可以工作。然而,这看起来真的像是在django背后:如果没有办法以django的方式做我想要的事情,也许通过使用include标记做一些特殊的事情,我想这是一种方式。嗯,我不确定是否有更django的方式来做。出于好奇,你为什么不想让db看到这些标语?将其保存在数据库中可以方便地通过管理员更新/添加标语。谢谢!对于1:因为我想在我的header.inc中包含标语,因此在每个页面上都包含标语,所以我希望避免包含额外的变量,因为我有不同的视图传递不同的上下文,这使得这条路线变得复杂。对于2:请看我对Loarfatron的回复——如果没有更好的方法,我想这是最好的方法。
import os,random

filename="averylargefile" file =
open(filename,'r')

#Get the total file size file_size = os.stat(filename)[6]

while 1:
  #Seek to a place in the file which is a random distance away
  #Mod by file size so that it wraps around to the beginning
  file.seek((file.tell()+random.randint(0,file_size-1))%file_size)

  #dont use the first readline since it may fall in the middle of a line
  file.readline()
  #this will return the next (complete) line from the file
  line = file.readline()

  #here is your random line in the file
  print line