2013-11-26 97 views
14

我想創建一個頭部,並要求使用用戶名/密碼和登錄按鈕進行登錄。目前,我如何設置我的頁面是按下登錄會將我發送到登錄頁面。我只想輸入信息並按「登錄」登錄我的網站的主頁。我如何設計我的urls.pyviews.py以在主頁上執行登錄?首頁登錄表單Django

我有一個base.html這是我的主頁的模板。在模板中,我做了一個login.html局部視圖:

<form action='/accounts/auth/' method='POST'> {% csrf_token %} 
    <div > 
     <label for='username'> Username </label> 
     <input type='text' name='Username' id='username'> 
     <label for='password'>Password </label> 
     <input type='password' name='Password' id='password'> 
     <input type='submit' value='login'> 
    </div> 
</form> 

我有點糊塗了action屬性因爲我不知道在哪裏發送表單數據,如果我想授權在同一頁面上登錄。

我views.py

def login(request): 
    c = {} 
    c.update(csrf(request)) 
    return render(request, 'login.html', c) 


def auth_view(request): 
    username = request.POST.get('username', '') 
    password = request.POST.get('password', '') 
    user = auth.authenticate(username = username, password = password)  

    if user is not None: 
     auth.login(request, user) 
     return HttpResponseRedirect('/accounts/loggedin') 
    else: 
     return HttpResponseRedirect('/accounts/invalid') 

我不知道在哪裏HttpResponseRedirect,以及如果記錄中所有的主頁上完成的。

也許我可以做一個render(request,SomePartialView.html)而不是HttpResponseRedirect

這裏是我的urls.py:

url(r'^$', 'photoblog.views.login'), #displays login.html 
url(r'^accounts/auth/$', 'photoblog.views.auth_view'), #authorize login 

回答

6

我建議django-registration還是比較方便的。還有一個電子郵件驗證。

你需要另外url說家:

url(r'^home/$', 'photoblog.views.home',name='home'), 
............. 

viewshome訪問被限制爲僅登錄用戶

from django.contrib.auth.decorators import login_required 
@login_required(login_url='/') #if not logged in redirect to/
def home(request):   
    return render(request, 'home.html') 

你不login.py

需要 csrf

ie:

def login(request): 
    return render(request, 'login.html') 

就足夠了,因爲render會通過csrf令牌。

from django.core.urlresolvers import reverse 
def auth_view(request): 
    username = request.POST.get('username', '') 
    password = request.POST.get('password', '') 
    user = auth.authenticate(username = username, password = password)  

    if user is not None: 
     auth.login(request, user) 
     return HttpResponseRedirect(reverse('home')) 
    else: 
     return HttpResponseRedirect('/accounts/invalid') 
12

如果你只是想有一個處理登錄靜態內容的主頁,Django的內置身份驗證的應用程序可以用很少的努力處理這個問題。你只需要綁定一個URL到django.contrib.auth.views.login,可能一個到django.contrib.auth.views.logout,寫一個登錄模板和一個註銷後模板,然後設置一些設置變量。

完整的安裝記錄在這裏: https://docs.djangoproject.com/en/dev/topics/auth/default/#module-django.contrib.auth.views

下面是我的一個工作項目中的相關位:

urls.py: 
# HomeView is a simple TemplateView that displays post-login options 
urlpatterns = patterns('', 
    ... 
    url(r'^myapp/$', HomeView.as_view(template_name='home.html'), name='home'), 
    url(r'^accounts/login/$', 'django.contrib.auth.views.login', name='login'), 
    url(r'^accounts/logout/$', 'django.contrib.auth.views.logout', name='logout'), 
    ... 
) 

settings.py: 
from django.core.urlresolvers import reverse_lazy 
... 
LOGIN_URL = reverse_lazy('login') 
LOGIN_REDIRECT_URL = reverse_lazy('home') 

templates/registration: 
login.html: 
{% extends "base.html" %} 
{% block head %} 
<title>Login</title> 
{% endblock %} 
{% block body %} 
{% if form.errors %} 
<p>Your username and password didn't match. Please try again.</p> 
{% endif %} 
<form method="post" action="{% url 'django.contrib.auth.views.login' %}"> 
{% csrf_token %} 
<table> 
<tr> 
    <td>{{ form.username.label_tag }}</td> 
    <td>{{ form.username }}</td> 
</tr> 
<tr> 
    <td>{{ form.password.label_tag }}</td> 
    <td>{{ form.password }}</td> 
</tr> 
</table> 
<input type="submit" value="login" /> 
<input type="hidden" name="next" value="{{ next }}" /> 
</form> 
{% endblock %} 

logged_out.html: 
{% extends "base.html" %} 
{% block head %} 
<title>Logged out</title> 
{% endblock %} 
{% block body %} 
<p>You have been logged out. You may <a href="{% url 'login' %}">log back in</a>.</p> 
{% endblock %} 

我不顯示我的base.html模板,但我相信圖案明顯。如果你想要的不僅僅是一張純粹的登錄表單,那麼沒有理由讓你的login.html模板變得更加有趣。這些名稱是默認值,如視圖所記錄的,但如果您願意,可以使用其他選項。

這就是你所需要的基本行爲。如果您使用docs中描述的login_required修飾器來包裝您的視圖,那麼只要未經過身份驗證的用戶嘗試訪問您的某個視圖,它就會重定向到您的登錄頁面。或者,如果您使用的是基於課程的視圖,請使用@method_decorator(login_required)作爲記錄here。從我的項目的兩個片段:

from django.contrib.auth.decorators import login_required 
from django.utils.decorators import method_decorator 

class HomeView(TemplateView): 
    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(HomeView, self).dispatch(*args, **kwargs) 

@login_required 
def report_for_group(request, group_id): 
    ... 

的文檔包括一些更復雜的設置的討論,你需要他們。

+0

我試過之後你的意見,但我不斷收到 「HomeView」 沒有定義。我嘗試導入到網址,但沒有奏效。我錯過了什麼? –

+0

@MichelleGlauser - 導入應該是所有必要的。我可以從遠處推薦的是檢查錯別字和不正確的路徑。 –

+0

如何更改登錄的默認模板位置?我沒有看到在哪裏放template_name – shenk

2

使用Django 1.11。 剛纔我有同樣的問題,這裏是爲我工作...

導入從內置的身份驗證的應用程序,並通過template_name kwarg在你的模板文件傳遞登錄視圖類。

在urls.py:

from django.contrib.auth.views import LoginView 

app_name = 'yourapp' 
urlpatterns = [ 
    url(r'^$', LoginView.as_view(template_name='yourapp/index.html'), name="index"), 
] 

而且在你看來,你可以使用表單變量來渲染出你的表格。 在我的情況下,我使用bootstrap。

index.html中:

{% extends 'base.html' %} 
{% loads bootstrap %} 
{% block content %} 
    <form method="post" action="{% url 'login' %}"> 
     {% csrf_token %} 
     {% bootstrap_form form %} 
     {% bootstrap_button "Login" button_type="submit" button_class="btn-primary" %} 
     {# Assumes you setup the password_reset view in your URLconf #} 
     <p><a href="{% url 'password_reset' %}">Lost password?</a></p> 
    </form> 
{% endblock content %} 
+0

我想,你不能添加上下文。 – Daniel

+0

@Daniel,你可以嘗試對LoginView進行子類化並重寫'get_context_data'方法。 – Goran

0

我找到了解決辦法。

第一,自定義登錄和註銷的觀點:

views.py

def login_user(request): 
logout(request) 
username = password = '' 
form1 = RegistrationForm() 
if request.POST: 
    username = request.POST['username'] 
    password = request.POST['password'] 

    user = authenticate(username=username, password=password) 
    if user is not None: 
     login(request, user) 
     return redirect("redirect any whre u want") 

return render(request, 'Write login templaye address') 

def logout_user(request): 
    user = request.user 
    logout(request, user) 
    return redirect("redirect any whre u want") 

然後在你的base.html文件,你應該這樣做:

base.html文件

<form method="post" action="/user/login/" novalidate> 
      {% csrf_token %} 


        <input class="form-control" id="id_username" name="username" placeholder="" 
          required="" type="text" 
          style=""> 
       </div> 
       <div class="form-group"> 

     <span class="material-icons" style="" 
     >lock</span> 
        <input class="form-control" id="password1" name="password" style="" autofocus="" 
          placeholder="" 
          required="" 
          type="password"> 
       </div> 

       <button class="btn btn-primary" type="submit" style=""></button> 
      </div> 


     </form> 

and login.html

<form method="post" action="/user/login/"> 
    {% csrf_token %} 
    <div class="form-group"> 
    <p> 
      <label for="id_username">username</label> 
      <input class="form-control" id="id_username" name="username" autofocus="" required="" type="text"> 
     </p> 
    <p> 
      <label for="id_password">password</label> 
      <input class="form-control" id="id_password" name="password" autofocus="" required="" type="password"> 
     </p> 
    <button type="submit">login</button> 
    </div> 
</form> 

urls.py

url(r'^login/$', views.login_user, name='login'), 
url(r'^logout/$', views.logout_user), 

其實你把投入在網頁上,讓他們到登錄頁面的輸入錯誤處理好。

2

你可以使用Django的內建登錄表單。它是簡單而有效的,它會給你一些功能,如表單驗證檢查。

在urls.py:

url(r'^login/$',views.loginView,name='login'), 

的意見。潘岳:

from django.contrib.auth.views import login 
from django.contrib.auth.forms import AuthenticationForm 

def loginView(request): 
if request.method == 'POST': 
    form = AuthenticationForm(data=request.POST) 
    if form.is_valid(): 
     user = form.get_user() 
     login(request,user) 
     return redirect('/website/profile/') 
else: 
    form = AuthenticationForm() 
return render(request,'website/login.html',{'form':form}) 

在html頁面:

<form method="post"> 
{% csrf_token %} 
{{form.as_p}} 
<p><input type="submit" value="Log in"></input></p>