Django在基本模板上形成

时间:2015-07-10 17:27:07

标签: django django-forms django-templates django-views

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

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

编辑:

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

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

2 个答案:

答案 0 :(得分: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时,才会显示登录表单。 您不必担心在每个视图中处理登录逻辑。

答案 1 :(得分:1)

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