page d'accueil formulaire de connexion Django

je veux créer une page d'accueil avec un en-tête qui demande à se connecter avec nom d'utilisateur/mot de passe et un bouton de connexion pour se connecter. Actuellement, comment j'ai mis en place ma page est que le fait d'appuyer sur login va m'Envoyer à une page de connexion. Je veux simplement entrer dans l'information et appuyez sur "login" pour se connecter sur la page d'accueil de mon site. Comment puis-je concevoir mon urls.py et views.py pour effectuer la connexion sur la page d'accueil?

j'ai un base.html c'est le modèle de ma page principale. Dans le modèle, j'ai fait un login.html vue:

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

je suis un peu confus pour l' action attribut car je ne sais pas où envoyer les données du formulaire si je voulais autoriser la connexion sur la même page.

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

je ne suis pas sûr de savoir où HttpResponseRedirect ainsi si la connexion est fait sur la page d'accueil.

peut-être que je peux faire un render(request,SomePartialView.html) au lieu de HttpResponseRedirect.

Voici mon urls.py:

url(r'^$', 'photoblog.views.login'),   #displays login.html
url(r'^accounts/auth/$', 'photoblog.views.auth_view'),    #authorize login
16
demandé sur Liondancer 2013-11-26 08:32:46

5 réponses

si vous voulez simplement avoir une page d'accueil avec un contenu statique qui gère les logins, L'application auth de Django intégrée peut gérer cela avec très peu d'effort. Vous avez juste besoin de lier une URL à django.contrib.auth.views.login et probablement l'un à django.contrib.auth.views.logout, écrivez un modèle de connexion et un modèle de post-Déconnexion, puis définissez quelques variables de réglage.

la configuration complète est documentée ici: https://docs.djangoproject.com/en/dev/topics/auth/default/#module-django.contrib.auth.views

Voici les bits de travail sur un projet de mine:

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

Je ne montre pas mon base.html modèle mais je crois que le modèle est évident. Si vous voulez plus qu'un simple formulaire de connexion il n'y a aucune raison que votre login.html le modèle ne peut pas être plus fantaisiste. Les noms sont des valeurs par défaut, comme documenté pour les vues, mais vous pourriez utiliser d'autres choix si vous vouliez de.

C'est tout ce dont vous avez besoin pour le comportement de base. Si vous enroulez vos points de vue avec l' login_required décorateur tel que décrit dans le docs, il redirigera vers votre page de connexion chaque fois qu'un utilisateur non authentifié essaiera d'accéder à l'une de vos vues. Ou, si vous utilisez des vues basées sur la classe, utilisez @method_decorator(login_required) tel que documenté ici. Deux autres extraits de mon projet:

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

les documents comprennent des discussions sur des configurations plus compliquées, si vous avez besoin ils.

12
répondu Peter DeGlopper 2013-11-26 06:50:12

je recommande django-registration il est assez facile. il y a une vérification d'email aussi dedans.

vous avez besoin d'un plus url dire à la maison:

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

ses views,home l'accès était limité aux seuls utilisateurs connectés

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

vous n'avez pas besoin csrflogin.py

ex:

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

suffit,render passera le jeton 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
répondu simple_human 2013-11-26 05:01:28

Utilisant Django 1.11. J'ai eu le même problème tout à l'heure, voici ce qui a fonctionné pour moi...

importez la classe de vue de connexion à partir de l'application intégrée auth et passez dans votre fichier template via le template_name kwarg.