我有这个 Django 网址:
url( r'^(?P<language>.*)/(?P<shop>.*)/(?P<brand>.*)/$', 'app.views.view_1' ),
Run Code Online (Sandbox Code Playgroud)
现在,“语言”、“商店”、“品牌”都是我 url 中的参数,我想将它们读入我的自定义 Django 上下文处理器。我该怎么做?
谢谢。
这就是我想要运行的.当我运行服务器并在视图中运行这些行然后返回一个HttpResponse时,一切都很顺利.但是当我运行python manage.py shell然后尝试运行这些行时,我收到一个错误:
product = Product.objects.get(pk=4)
template = loader.get_template('weekly-email.html')
user = User.objects.get(pk=1)
body = template.render(Context({
'user': user,
'product': product,
}))
Run Code Online (Sandbox Code Playgroud)
输出:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Users/croberts/.virtualenvs/testproj/lib/python3.4/site-packages/django/template/backends/django.py", line 74, in render
return self.template.render(context)
File "/Users/croberts/.virtualenvs/testproj/lib/python3.4/site-packages/django/template/base.py", line 209, in render
return self._render(context)
File "/Users/croberts/.virtualenvs/testproj/lib/python3.4/site-packages/django/template/base.py", line 201, in _render
return self.nodelist.render(context)
File "/Users/croberts/.virtualenvs/testproj/lib/python3.4/site-packages/django/template/base.py", line 903, in render
bit = self.render_node(node, context)
File "/Users/croberts/.virtualenvs/testproj/lib/python3.4/site-packages/django/template/base.py", line 917, in render_node
return node.render(context)
File "/Users/croberts/.virtualenvs/testproj/lib/python3.4/site-packages/django/template/base.py", line 963, …Run Code Online (Sandbox Code Playgroud) 假设我有一个上下文处理器:
def title(request):
return {'titles': 'mytitle'}
Run Code Online (Sandbox Code Playgroud)
我可以在模板中访问此变量{{ titles }}.
但是我怎么能在视野中这样做呢?
def myview(request):
print request.titles
Run Code Online (Sandbox Code Playgroud)
似乎不起作用 - 'WSGIRequest' object has no attribute 'titles'
或者可能有更好的方法(比上下文处理器)在视图和模板中都可以访问全局变量?
提前致谢.
我有一个带有激活密钥的激活网址( /user/activate/123123123 )。这样做没有任何问题。get_context_data 可以将其很好地放入模板中。我想要做的是将其作为关键字段的初始值,以便用户只需输入注册时创建的用户名和密码。
如何从 context 或 get() 中提取密钥而不将字段硬编码到模板中?
class ActivateView(FormView):
template_name = 'activate.html'
form_class = ActivationForm
#initial={'key': '123123123'} <-- this works, but is useless
success_url = 'profile'
def get_context_data(self, **kwargs):
if 'activation_key' in self.kwargs:
context = super(ActivateView, self).get_context_data(**kwargs)
context['activation_key'] = self.kwargs['activation_key']
"""
This is what I would expect to set the value for me. But it doesn't seem to work.
The above context works fine, but then I would have to manually build the
form in the template which …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Django中重构一个相当重要的视图函数.浮动的变量太多了,这是一个巨大的功能.
理想情况下,我想将视图模块化为逻辑函数.但是,我必须传递函数上下文以便轻松访问变量.
例如:
def complex_view(request, slug):
some complex logic which creates variable abc ...
...
some more complex logic which uses variable abc ...
...
etc.
Run Code Online (Sandbox Code Playgroud)
应该变得像:
def complex_view(request, slug):
process_X()
...somehow pass variables and context to next function...
process_Y()
...
etc.
def process_X():
...
def process Y():
...
Run Code Online (Sandbox Code Playgroud)
我可以想到几种方法来实现这一点,其中一些方法在本页中有所指出:http: //mail.python.org/pipermail/tutor/2009-February/067506.html
一个.主视图中定义的子功能.这看起来很糟糕,因为很难分辨哪些变量是共享的,哪些不是.
湾 传递locals()中作为字典.这也是kludgey,因为现在有两种不同的方式来访问变量:xyz和contextDict['xyz'].你必须在呼叫中使用一个N,并N+1在堆栈中调用下一个.
C.暴力将所有变量传递给每个函数调用并返回相关的变量.当涉及到很多变量时,这变得非常乏味.
d.在C++/C#中,我只需创建一个类MyComplexViewContext,定义所有共享变量,并创建成员函数来执行工作.然后你可以使用self.xyz该类中的所有内容.我想我也可以在Python中使用这个方法.不知道这是不是最好的方法.
你对Python/Django中首选的方法有什么看法?
我有一些观点,它们都运行良好,并且都使用扩展一个基本模板的模板,输出核心HTML,页眉,页脚,导航等.快乐的家庭.
现在,我想在页面上玩会话,因为你无法从模板中访问用户的会话信息而没有实际从视图中传递它(纠正我错在哪里)我有两个选择:
将会话数据添加到我作为上下文传递给视图中的HTML模板的其余位(不确定这是否是一个好方法)
以某种方式从视图中继承所有现有视图,这些视图将始终将上下文推送到正在处理的模板 - 这样我就不必担心将来可能要添加到我的页面的任何其他内容 - 这可能吗?
我对django很新,可能还有其他正确的做法 - 所有的建议都非常感谢.
我的代码是这样的:我自定义我的上下文,并希望在模板中访问我的查询集
class GetStudentQueryHandler(ListView):
template_name = 'client.html'
paginate_by = STUDENT_PER_PAGE
context_object_name = 'studentinfo'
def get_context_data(self, **kwargs):
context = super(GetStudentQueryHandler, self).get_context_data(**kwargs)
context['can_show_distribute'] = self.request.user.has_perm('can_show_distribute_page')
context['form'] = QueryStudentForm
return context
def get_queryset(self):
Run Code Online (Sandbox Code Playgroud)
问题是:如何访问模板中get_queryset方法返回的查询集?我知道我可以访问自定义属性,如studentinfo.can_show_distribute,如何访问查询数据?
我需要在所有页面中显示一些统计数字,所以我决定使用上下文处理器。但我刚刚发现我的函数在每次加载页面时都会被调用 2 到 7 次。我在函数内部进行了 4 次查询,因此性能非常差。每个页面加载最多可能需要 28 (4*7) 个查询...
我想知道为什么会发生这种情况以及我可以做些什么来避免它。
设置.py
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.request',
'django.contrib.messages.context_processors.messages',
'django.core.context_processors.static',
'core.views.numbers',
)
Run Code Online (Sandbox Code Playgroud)
视图.py
def numeros(request):
...
a=table1.objects.count()
b=table2.objects.count()
c=table3.objects.count()
d=table4.objects.count()
...
return {'a': a,
'b': b,
'c': c,
'd': d,
'e': e,
'f': f,
'g': g,
'h': h
}
Run Code Online (Sandbox Code Playgroud)
[更新 - 谢谢] @okm 和 @catherine 提供了非常好的补充解释。两者都是正确的,正如@okm 所说,上下文处理器被多次调用,因为我多次使用 RequestContext。
@catherine 也是正确的。我们需要特别注意我们在上下文处理器中放置的内容。我更改了代码,只是在登录页面中显示统计数字。
我发现自己总是将'用户'变量传递给每次调用 render_to_response
我的很多渲染都是这样的
return render_to_response('some/template', {'my':context,'user':user})
Run Code Online (Sandbox Code Playgroud)
有没有办法自动发送这个'user'变量,而无需在每次调用方法时手动将其添加到上下文中?
我收到这个错误
TypeError at /debate/1/
get_context_data() takes exactly 2 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)
现在它被定义为:
def get_context_data(self, **kwargs):
Run Code Online (Sandbox Code Playgroud)
我希望它是:
def get_context_data(self, request, **kwargs):
Run Code Online (Sandbox Code Playgroud)
所以我可以在里面做:
sort_by = request.GET.get('sort', '-rating_score')
Run Code Online (Sandbox Code Playgroud)
这是个好主意,怎么做?
django ×10
django-context ×10
python ×2
templates ×2
django-urls ×1
django-views ×1
forms ×1
get ×1
request ×1
shell ×1
typeerror ×1
view ×1