Django将对象列表传递给模板

时间:2011-05-03 09:15:07

标签: django django-templates django-urls

我无法将get_profiles传递给与r'^ compose / $'相同的模板。 r'^ users / $'是我正在使用的模型,它的工作原理。 “compose”是我的views.py中的一个函数。

from django.conf.urls.defaults import *
from django.views.generic.simple import redirect_to
from django.views.generic.simple import direct_to_template

from messages.views import *

from userprofile.views import get_profiles

urlpatterns = patterns('',
    url(r'^$', redirect_to, {'url': 'inbox/'}),
    url(r'^inbox/$', inbox, name='messages_inbox'),
    url(r'^outbox/$', outbox, name='messages_outbox'),
    url(r'^compose/$', compose, name='messages_compose'),
    url(r'^users/$', direct_to_template, {'extra_context': { 'profiles': get_profiles }, 'template': 'messages/users.html' }),
)
userprofile/views.py
def get_profiles():
    return Profile.objects.order_by("user")

我试过了:

url(r'^compose/$', compose, direct_to_template, {'extra_context': { 'profiles': get_profiles },  'template': 'messages/compose.html' }),

但是我得到的函数对象不可迭代。

3 个答案:

答案 0 :(得分:2)

正如其他人所说,你需要实际调用该函数,但是如果你在urls.py中这样做,那么每个进程只会评估一次。你不想这样做。

您没有显示get_profiles的作用,但我认为它是某种实用功能。我倾向于认为那些属于单独的文件lib.pyutils.py,而不是views.py。 (也就是说,假设它本身并不是一个视图 - 如果是,那么你需要重新考虑你的整个方法。)

但是,我认为您实际需要做的是制作模板标签。如果您愿意,可以将逻辑保留在get_profiles中,然后创建一个调用该函数的简单标记。然后你不需要在extra_context中传递数据 - 只需将标记添加到模板中。

答案 1 :(得分:0)

尝试在函数调用中添加括号吗?

'profiles': get_profiles()

否则你只是传递对函数对象的引用。

但问题是,只有在调用urls.py时才会对此进行评估。

为什么不使视图功能与url'users /'对应?

答案 2 :(得分:0)

get_profiles(),带括号