基本模板上的 Django 表单

Posted

技术标签:

【中文标题】基本模板上的 Django 表单【英文标题】:Django forms on base template 【发布时间】:2015-09-29 13:27:51 【问题描述】:

我正在构建的网站有一个登录表单作为所有其他模板扩展的 base.html 模板的一部分;因此,我需要以某种方式处理每个页面上的登录/注销逻辑。

目前每个页面都在单独的视图中加载,那么实现这一点的最佳和最干燥的方式是什么?我正在阅读的所有教程都将登录页面分开。

编辑:

我最初的方法是让表单操作始终加载索引,并且几乎可以正常工作,但是我无法将用户重定向回他们登录之前的任何位置,这让我很恼火。

之后,我决定将表单重新设计为 Django ModelForm,这样我就可以引发我之前无法做到的验证错误,但现在模板在通过索引视图呈现时只有 ModelForm 对象,因此输入框甚至不会在其他页面上呈现..

【问题讨论】:

那么你的意思是你目前正在每个视图中实现表单逻辑而不是一次? 是的,我以后可能会有更多的观点,看起来很可笑 【参考方案1】:

最好的选择是创建一个 HEADER.HTML 模板,并在 include 的帮助下将其包含在您的 base.html 中。 这将是一个比在 base.html 中创建或显示表单更好的选择,您也可以对页脚执行相同操作。

【讨论】:

这比拥有一个带有页眉和页脚的骨架 base.html 更好吗?【参考方案2】:

您可以检查模板中的登录表单代码。

您可以将登录模板放在base_login.html 中并在每个页面上扩展它。

示例基本模板代码:

% if not user.is_authenticated %
    <form action="% url my_login_url %" method="POST">
        % csrf_token %
        <input id="username_field" name="username" type="text" />
        <input id="password_field" name="password" type="password" />
        <button type="submit">Login</button>
    </form>

仅当用户未通过身份验证时才会显示此登录表单。

然后为login 页面和LoginForm 编写一个视图来处理登录过程。

views.py

class LoginView(FormView):

    ...
    your login and redirection logic here
    ...

forms.py

class LoginForm(forms.Form):

    username = ..
    password = ..

    ...
    your form validations and other logic
    ...

因此,无论是任何页面,只有在用户尚未登录时才会显示登录表单,并且所有这些登录请求都只会发送到您的LoginView。 您无需担心处理每个视图中的登录逻辑。

【讨论】:

要对此进行扩展,您可以(并且应该根据 DRY 原则)将此代码放在一个 base_login.html 文件中,该文件位于与您的应用程序不同的目录中,并且您使用 extends标签包含在每个模板中(我建议对任何其他重复代码也这样做)。然后,在您的settings.py 中,只需将目录添加到TEMPLATESDIRS 选项(see this link for info) 是的,我们可以做到。那将是一种 DRYer 方法。将其添加到 ans 中。 我想我可能对视图和 url 的概念感到困惑 URL 是一个普通的 url 或者一个页面的路径。当访问者的浏览器请求 URL 时,Django 会将请求与它的 urls.py 文件进行匹配。如果找到匹配项,Django 将转到与该 URL 关联的视图。视图通常处理所有数据库操作。它抓取数据并将其传递。然后一个模板(在视图中指定)显示该数据。 webmonkey.com/2010/02/use_url_patterns_and_views_in_django 难道视图不应该代表一个页面吗?和一个 url 到那个页面的链接?当我实际从现有 url 和视图(网站的页面)登录时,为什么我会有一个单独的 url 和视图用于登录另外,如果表单发生更改,我将如何在表单旁边引发错误,例如用户名或密码错误用于登录的网址

以上是关于基本模板上的 Django 表单的主要内容,如果未能解决你的问题,请参考以下文章

我们可以格式化模型表单如何在模板上的 Django 中显示吗

将 Django 表单传递给模板标签

Django模板表单字段以无序方式显示

Django - 从模板内部调用带有表单的视图

Django:在带有前缀的模板中显示表单名称

编辑模板上的表单字段值