2015-04-02 91 views
1

场景在同一模板中渲染多个视图的最佳方式是什么?

我需要在同一视图中呈现来自第三方应用程序的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件事。

  1. 这是在同一视图中渲染2个视图的最佳方式吗?

  2. 感觉就像有两个了许多措施来实现这一目标。有没有更简单的方法来解决这个问题?

回答

0

我有做类似这样的东西:

一两个模板login.htmlsignup.html。在这些模板中,我可以访问上下文变量,如form,primary_btn_label以及您在render_login_form包含标记中的其他内容。

但后来我有一个初始化这些变量(如form等)

背景处理器(保存在myapp/context_processors.py)看起来像这样一个自定义的背景处理器(参见context processors Django文档):

TEMPLATE_CONTEXT_PROCESSORS = (
    ... 
    'myapp.context_processors.login_register_form', 
) 
0:
from .forms import LoginForm, RegisterForm 

def login_register_form(request): 
    login_popup_form = LoginFormForPopup() 
    register_popup_form = RegisterFormForPopup() 
    context = { 
     'login_popup_form': login_popup_form, 
     'register_popup_form': register_popup_form, 
    } 

    return context 

自定义背景处理器在你的Django设置文件将其添加到TEMPLATE_CONTEXT_PROCESSORS变量启用

希望这会有所帮助!

+0

谢谢安东。这与我刚开始的时间并不遥远,但决定反对它,因为视图还包含用于呈现模板的上下文数据和初始值。因此,当一个视图已经存在并且做了同样的工作时,它开始觉得有太多的重复。 – james 2015-04-02 16:51:08

相关问题