web-dev-qa-db-ja.com

ホームページログインフォームDjango

ユーザー名/パスワードでログインするよう要求するヘッダーと、ログインするためのログインボタンを備えたホームページを作成したいと思います。現在、私のページの設定方法は、ログインを押すとログインページが表示されることです。私は単に情報を入力し、「ログイン」を押して私のサイトのホームページにログインしたいだけです。ホームページでログインを実行する_urls.py_および_views.py_を設計するにはどうすればよいですか?

メインページのテンプレートである_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の場所もわかりません。

おそらく、HttpResponseRedirectの代わりにrender(request,SomePartialView.html)を実行できます。

これが私のurls.pyです:

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

ログインを処理する静的コンテンツを含むホームページが必要な場合、Django=組み込みの認証アプリケーションはこれを非常に少ない労力で処理できます。URLを_Django.contrib.auth.views.login_およびおそらく_Django.contrib.auth.views.logout_の1つで、ログインテンプレートとポストログアウトテンプレートを作成し、いくつかの設定変数を設定します。

完全なセットアップはここに文書化されています: 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_デコレータでラップすると、認証されていないときにログインページにリダイレクトされますユーザーがビューの1つにアクセスしようとしました。または、クラスベースのビューを使用している場合は、@method_decorator(login_required)を文書化されたとおりに使用してください here 。私のプロジェクトからさらに2つのスニペット:

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

ドキュメントには、必要に応じて、より複雑なセットアップの説明が含まれています。

13
Peter DeGlopper

Django-registrationをお勧めします。これは非常に簡単です。電子メールによる確認もあります。

さらにurlが必要ですhome:

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.pycsrfは必要ありません

すなわち:

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

Djangoの組み込みログイン形式を使用できます。簡単で効率的です。フォーム検証チェックなどの機能を提供します。

urls.py:

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

views.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ページ:

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

Django 1.11。)を使用私はちょうど今同じ問題を抱えていました、ここに私のために働いたものがあります...

組み込みの認証アプリからログインビュークラスをインポートし、template_name kwarg。

rls.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 so。

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

私は解決策を見つけました。

まず、ログインビューとログアウトビューをカスタマイズします。

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>

そして、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),

実際には、ホームページで入力を取得し、ログインページに入力エラー処理に適しています。

0
armin