2015-07-10 62 views
1

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

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

编辑:

我原来的方法,使形式的行动总是加载指数与然而相当多的工作,我的事实恼火,我不能将用户重定向回他们登录之前,无论他们是in。

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

+0

所以你在说什么是你目前在每个视图中执行表单逻辑,而不是一次执行? –

+0

是的,我可能在将来有更多的意见,它似乎ridicoulus – davegri

回答

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 
    ... 

所以,无论是任何页面,登录表单将只显示,如果用户没有的loggedIn,所有这些登录请求将仅限于您的LoginView。 您不必担心在每个视图中处理登录逻辑。

+1

为了扩大这一点,你可以(也应该,根据DRY原则)将这段代码放置在一个'base_login.html'文件中驻留在与你的应用程序分开的目录,并且你使用[extends](https://docs.djangoproject.com/en/1.7/topics/templates/#template-inheritance)标签包含在每个模板中(我建议这样做以及任何其他重复的代码)。然后,在你的'settings.py'中,只需将目录添加到'TEMPLATES'的'DIRS'选项[(请参阅此链接了解详情)](https://docs.djangoproject.com/en/1.8/topics/templates /) –

+1

是的,我们可以做到这一点。那将是DRYer方法。将它添加到ans。 –

+0

我想我可能会对视图和网址的概念感到困惑 – davegri

1

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

+0

这是怎么比一个带有页眉和页脚的骨架base.html更好? – davegri