基本模板上的 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
中,只需将目录添加到TEMPLATES
的DIRS
选项(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 表单的主要内容,如果未能解决你的问题,请参考以下文章