2013-11-26 29 views
14

Giriş yapmak için kullanıcı adı/şifre ve giriş butonu ile giriş yapmak isteyen bir başlık içeren bir ana sayfa oluşturmak istiyorum. Şu anda, sayfamı nasıl kurduğum, giriş yapmanın beni giriş sayfasına göndereceğidir. Bilgiye girmek ve sitemin ana sayfasında oturum açmak için "giriş yap" tuşuna basmak istiyorum. Ana sayfada oturum açmak için urls.py ve views.py'umu nasıl tasarlayabilirim?anasayfa giriş formu Django

Ana sayfamın şablonu olan bir base.html var. Ben aynı sayfada giriş yetkisi istiyorsa o form verilerini göndermek için emin kalacaktı olarak action özellik için biraz karıştı

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

: şablonun içinde, ben bir login.html kısmi bir görünüm yaptı.

Benim 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') 

Giriş yaparken tüm ana sayfasında yapılır yanı ise nerede HttpResponseRedirect emin değilim.

Belki HttpResponseRedirect yerine render(request,SomePartialView.html) yapabilirim. Ben oldukça kolaydır django-registration tavsiye

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

cevap

6

:

İşte benim urls.py olduğunu. e-posta doğrulaması da var.

eve demek bir ekleme url gerekir:

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

onun views, home erişim sınırlıydı yalnızca giriş yapmış kullanıcılar sen login.py

yılında csrf gerekmez

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') 

ie:

, csrf belirtecini geçecek kadar

yeterlidir. Sadece oturumların kolları statik içeriğe sahip bir ana sayfası istiyorsanız

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 yerleşik auth uygulaması çok az çaba ile bu işleyebilir. Bir URL'yi django.contrib.auth.views.login'a ve muhtemelen bir tane django.contrib.auth.views.logout'a bağlamanız, bir giriş şablonu ve bir çıkış sonrası şablonu yazmanız, ardından birkaç ayar değişkenini belirlemeniz yeterlidir.

tam kurulum burada belgelenmiştir: Burada https://docs.djangoproject.com/en/dev/topics/auth/default/#module-django.contrib.auth.views

benim bir çalışma projesinden alakalı bit şunlardır:

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 %} 

benim base.html şablonu gösteren değilim ama kalıptır güveniyorum açık. Eğer çıplak bir giriş formundan daha fazlasını istiyorsanız, login.html şablonunuzun meraklısı olamaz. Adlar, görünümler için belgelendiği gibi varsayılan değerlerdir, ancak isterseniz diğer seçenekleri kullanabilirsiniz.

Temel davranış için gereken tek şey budur. Görünümlerinizi 'da açıklandığı gibi login_required dekoratörüyle kopyalarsanız, kimliği doğrulanmamış bir kullanıcının görünümlerinizden birine erişmeye çalıştığında, giriş sayfanıza yönlendirilir. Veya, sınıf tabanlı görünümler kullanıyorsanız, here belgelenmiş olarak @method_decorator(login_required) kullanın. Projemin iki kişi daha parçacıkları:

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

dokümanlar biraz daha karmaşık kurulumları tartışmaları arasında, bunları gerektiğinde.

+0

tanımlanmamış. URL'lere aktarmayı denedim, ancak bu işe yaramadı. Neyi kaçırıyorum? –

+0

@MichelleGlauser - ithalat gerekli olan her şey olmalıdır. Uzakta önerebileceğim tek şey yazım hatalarını ve yanlış yolları kontrol etmektir. –

+0

Oturum açmak için varsayılan şablon konumunu nasıl değiştirebilirim? Şablon_adı – shenk

2

Django Kullanımı 1.11. ben burada ... benim için çalıştı ne, şimdi aynı problem vardı

İthalat yetkilendirme uygulamasında inşa edilmiş ve template_name kwarg aracılığıyla şablon dosyasında geçmesi gelen giriş görünümü sınıfı. urls.py olarak

:

from django.contrib.auth.views import LoginView 

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

Ve görünümünde Formunuzu işlemek için form değişken kullanabilirsiniz. Benim durumumda bootstrap kullanıyorum. index.html olarak

:

{% 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

Buna bağlam ekleyemezsiniz, bence. – Daniel

+0

@Daniel, LoginView alt sınıfını ve 'get_context_data' yöntemini geçersiz kılmayı deneyebilirsiniz. – Goran

0

çözüm bulundu.

ilk giriş özelleştirmek ve çıkış görünümler:

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") 

Sonra base.html içinde böyle yapmalısınız:

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> 

Ve login.html

url(r'^login/$', views.login_user, name='login'), 
url(r'^logout/$', views.logout_user), 
<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 Aslında anasayfada girdileri almak ve giriş sayfasına giriş hata işleme için onun iyi onlara.

2

Django'nun yerleşik giriş formunu kullanmanız gerekir. Bu kolay ve verimli bir şekilde bırakılır. Ve size form doğrulama kontrolü gibi bazı özellikler verecektir. urls.py içinde

: görünümlerinde

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

.py:

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 sayfası: Senden tavsiye aşağıdaki denedim ama "HomeView" almaya devam

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