我需要在同一视图中呈现来自第三方应用程序的2个独立视图。有问题的意见是用于登录和注册。
对于每个视图的模板然后简单地包括一包含标签呈现的通用形式。
解决方案
的解决方案,我想出来的是注册一个标签用于创建一个template.Node
渲染每一个每个视图。
from django import template
from third_party_app import LoginView, SignupView
register = template.Library()
@register.tag
def login_form(parser, token):
return ViewNode(LoginView, template_name=get_template_name(token))
@register.tag
def signup_form(parser, token):
return ViewNode(SignupView, template_name=get_template_name(token))
class ViewNode(template.Node):
def __init__(self, view_class, **kwargs):
self.view_class = view_class
self.kwargs = kwargs
def render(self, context):
request = context['request']
self.kwargs['request'] = request
view = self.view_class(**self.kwargs)
response = view.get(request)
response.render()
return response.content
def get_template_name(token):
tag_name, template = token.split_contents()
return str(template[1:-1])
而且主视图模板看起来是这样的:
<div>
{% login_form 'account/login.html' %}
</div>
... some other html ...
<div>
{% signup_form 'account/signup.html' %}
</div>
为每个单独的登录的模板,并立即登记观点仅包含一个包含标签渲染另一个模板通用形成。
所以账户/ login.html的很简单:
{% render_login_form %}
和包含标签看起来像这样
@register.inclusion_tag('account/snippets/form.html', takes_context=True)
def render_login_form(context):
return {'form': context['form'],
'primary_btn_label': 'Sign In',
'secondary_btn_label': 'Forgot Password?',
'tertiary_btn_label': 'Sign Up?',
'col_offset': '3',
'col_width': '9'}
问题
它的工作原理,但我米想知道2件事。
这是在同一视图中渲染2个视图的最佳方式吗?
感觉就像有两个了许多措施来实现这一目标。有没有更简单的方法来解决这个问题?
谢谢安东。这与我刚开始的时间并不遥远,但决定反对它,因为视图还包含用于呈现模板的上下文数据和初始值。因此,当一个视图已经存在并且做了同样的工作时,它开始觉得有太多的重复。 – james 2015-04-02 16:51:08