web-dev-qa-db-fra.com

page d'accueil formulaire de connexion Django

Je veux créer une page d'accueil avec un en-tête qui demande de se connecter avec un nom d'utilisateur/mot de passe et un bouton de connexion pour se connecter. Actuellement, ma page est configurée de telle sorte que si vous appuyez sur login, vous m'enverrez à une page de connexion. Je veux simplement entrer les informations et appuyez sur "login" pour vous connecter sur la page d'accueil de mon site. Comment puis-je concevoir mon urls.py et mon views.py pour pouvoir me connecter sur la page d'accueil?

J'ai un base.html qui est le modèle pour ma page principale. Dans le modèle, j'ai créé une vue partielle 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>

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

Mon point de vue.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 sais pas non plus où HttpResponseRedirect également si la connexion est entièrement effectuée 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
17
Liondancer

Si vous souhaitez simplement avoir une page d'accueil avec un contenu statique qui gère les connexions, l'application d'authentification intégrée de Django peut gérer cela avec très peu d'effort. Il vous suffit de lier une URL à Django.contrib.auth.views.login et probablement une à Django.contrib.auth.views.logout, d'écrire un modèle de connexion et un modèle de post-déconnexion, puis de définir quelques variables de paramétrage.

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

Voici les extraits pertinents d'un projet en cours:

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 modèle base.html mais je suis convaincu que le modèle est évident. Si vous voulez plus qu'un formulaire de connexion simple, il n'y a aucune raison que votre modèle login.html ne soit pas plus sophistiqué. Les noms sont des valeurs par défaut, telles que documentées pour les vues, mais vous pouvez utiliser d'autres choix si vous le souhaitez.

C'est tout ce dont vous avez besoin pour le comportement de base. Si vous encapsulez vos vues avec le décorateur login_required comme décrit dans le document docs , il sera redirigé vers votre page de connexion chaque fois qu'un utilisateur non authentifié tente d'accéder à l'un de vos vues. Ou, si vous utilisez des vues basées sur des classes, utilisez @method_decorator(login_required) comme indiqué dans la documentation 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 incluent des discussions sur certaines configurations plus complexes, si vous en avez besoin.

13
Peter DeGlopper

Je recommande Django-registration c'est assez facile. il contient également une vérification de courrier électronique.

vous avez besoin d'une addition url dire à la maison:

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

son accès views, home a été 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 de csrf dans login.py

c'est à dire:

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

est suffisant, car render transmettra 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
simple_human

Vous pouvez utiliser le formulaire de connexion intégré de Django. Il est facile et efficace à quitter. Et il vous donnera quelques fonctionnalités comme le contrôle de validation de formulaire.

dans urls.py:

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

dans 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})

en page html: 

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

Utilisation de 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 depuis l'application d'authentification intégrée et transmettez votre fichier de modèle via le template_name kwarg.

Dans 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"),
]

Et à votre avis, vous pouvez utiliser la variable de formulaire pour rendre votre formulaire . Dans mon cas, j'utilise bootstrap donc.

Dans 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

J'ai trouvé la solution.

tout d'abord, personnalisez les vues de connexion et de déconnexion:

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

Ensuite, dans votre base.html, vous devriez faire comme ceci:

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>

Et 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),

En fait, vous prenez les entrées dans la page d'accueil et leur donnez-les dans la page de connexion, c'est bon pour la gestion des erreurs d'entrée.

0
armin