Django:如何包含modelform?

时间:2011-03-10 11:48:12

标签: django django-forms

{%include'django.contrib.auth.views.login'%}

我不想手工编写所有内容..我真的很讨厌这个,django充满了自动化的东西。

目标是将registration / login.html包含在base.html中,以便我可以在每个页面中都有此表单

如果我只包含模板本身(registration / login.html),则问题出现“form.login”,我的意思是“form”var未定义,因为这个来自VIEW,当你要登录url时调用它。那么我如何手动调用该视图包含或者至少在我自己的视图中通过我自己获取django.contrib.auth.views.login变量然后传递给base.html?

P.S。它不只是关于登录表单,我认为会有更多这样的情况

4 个答案:

答案 0 :(得分:3)

我在#django irc找到了更好的解决方案。

他们打电话给inclusion tags

我会给你我的代码,因为我在django中有很多问题需要学习新东西=)

file:templatetags / form_login.py

from django import template
register = template.Library()

from django.contrib.auth.forms import AuthenticationForm

@register.inclusion_tag('registration/login.html')
def form_login():
    return { 'form': AuthenticationForm() }

现在你可以在任何地方使用你的表格,这将预呈现模板,这就是它!没有愚蠢的上下文处理器,需要修改整个项目的settings.py,如果你单独编写一个小应用程序,这真的是sux ..

答案 1 :(得分:2)

如果您需要在每个页面上使用登录表单

创建一个上下文处理器:

def login_form_processor(request):
    return {
        'login_form': LoginForm(request.POST or None)
    }

将其添加到settings.CONTEXT_PROCESSORS

包含登录表单的模板:

{% with login_form as form %}
    {% include "registration/login.html" %}
{% endwith %}

你也可以让你形成延迟加载,所以在第一次使用表单之前不会创建表单。

from django.utils improt functional
def login_form_processor(request):
    create_login_form = lambda: LoginForm(request.POST or None)
    return {
        'login_form': functional.lazy(create_login_form, LoginForm)
    }

但我想你不会想要延迟加载功能,因为登录表单初始化起来很便宜。


重用视图

关于你的问题中的“抓取变量”部分:你无法从视图中获取变量。 Django view是返回response个对象的方法。您无法从response获取变量。但是,有些视图会接受extra_context和其他属性。这些属性允许您在URL中配置这些视图,或者使用您自己的视图包装它们,例如:

def my_login_view(request):
    some_extra_data = get_some_data()
    extra_context = {
        'some_extra_var': some_extra_data
    }
    return login_view(request, extra_context=extra_context, template="my_template.html")

这并不完全是从视图中获取变量,更像是对现有视图的扩充。

如果您希望有更多这样的情况,请在视图中减少数据访问。调用一些检查权限的方法。从上下文处理器收集一些数据。返回呈现的响应。现在,您可以在其他视图中重用数据。

答案 2 :(得分:0)

您可以在表单html上指定action以指向访问相应视图的URL。

如果您想要一个表单,比如称为login_form总是填充在所有模板中,请将其放入context_processors

答案 3 :(得分:0)

浏览django.contrib.auth.views的代码,您会看到变量 form site 和* site_name *都会传递给模板。

您(1)提供自定义注册表单或(2)如果您想使用它,只需在视图中导入 django.contrib.auth.forms.AuthenticationForm