Django:如何包含模型表单?

Posted

技术标签:

【中文标题】Django:如何包含模型表单?【英文标题】:Django: How to include modelform? 【发布时间】:2011-07-12 15:59:29 【问题描述】:

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

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

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

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

附:不仅仅是登录表单,我想这样的情况还会更多

【问题讨论】:

【参考方案1】:

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

他们打电话给inclusion tags

我会给你我的代码,因为我在 django 学习新东西时遇到了很多问题 =)

文件: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,如果你编写独立的小应用程序,这真的很糟糕..

【讨论】:

【参考方案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)
    

但我猜你不会想要延迟加载功能,因为 login-form 初始化起来很便宜。


重用视图

关于您问题中的“抓取变量”部分:您无法从视图中抓取变量。 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")

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

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

【讨论】:

Oo skirmantai pavarei :D Thnx man =) 你不愧是***的解释大师! =) 我真的需要一个非常好的实现示例 =)【参考方案3】:

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

如果您想要一个表单,例如在所有模板中始终填充为 login_form,然后将其放入 context_processors。

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于Django:如何包含模型表单?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中从 2 个不同的模型对象创建表单对象?

如何在 Django 的表单中拥有嵌套的内联表单集?

具有来自两个不同模型的字段的 Django 表单

不使用 django 表单如何验证和保存表单数据

如何从 Django 中的编辑表单更新对象?

Django 重复键值违反唯一约束错误模型表单