it-swarm.com.de

homepage-Anmeldeformular Django

Ich möchte eine Homepage mit einer Kopfzeile erstellen, in der Sie aufgefordert werden, sich mit Benutzername und Kennwort anzumelden, und eine Login-Schaltfläche zum Anmelden. Derzeit ist meine Seite so eingerichtet, dass ich durch Drücken von login zu einer Login-Seite komme. Ich möchte einfach die Informationen eingeben und "Anmelden" drücken, um sich auf der Startseite meiner Website anzumelden. Wie kann ich meinen urls.py und views.py so gestalten, dass er sich auf der Homepage anmeldet?

Ich habe einen base.html, der die Vorlage für meine Hauptseite ist. In der Vorlage habe ich eine login.html-Teilansicht erstellt:

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

Ich bin etwas verwirrt wegen des action-Attributs, da ich nicht sicher bin, wohin die Formulardaten gesendet werden sollen, wenn ich mich auf derselben Seite anmelden möchte.

Meine Ansichten.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')

Ich bin mir nicht sicher, wohin HttpResponseRedirect auch gehen soll, wenn das Einloggen auf der Startseite erfolgt.

Vielleicht kann ich anstelle von HttpResponseRedirect eine render(request,SomePartialView.html) machen.

Hier ist meine urls.py:

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

Wenn Sie nur eine Homepage mit statischem Inhalt haben möchten, die Anmeldungen verarbeitet, kann die in Django integrierte Authentifizierungsanwendung dies mit sehr geringem Aufwand erledigen. Sie müssen lediglich eine URL an Django.contrib.auth.views.login und wahrscheinlich eine an Django.contrib.auth.views.logout binden, eine Login-Vorlage und eine Post-Logout-Vorlage schreiben und dann ein paar Einstellvariablen festlegen.

Das vollständige Setup ist hier dokumentiert: https://docs.djangoproject.com/en/dev/topics/auth/default/#module-Django.contrib.auth.views

Hier sind die relevanten Teile aus einem Arbeitsprojekt von mir:

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

Ich zeige nicht meine base.html-Vorlage, aber ich vertraue darauf, dass das Muster offensichtlich ist. Wenn Sie mehr als nur ein Anmeldeformular benötigen, gibt es keinen Grund, dass Ihre login.html-Vorlage nicht schicker sein könnte. Die Namen sind Standardwerte, wie für die Ansichten dokumentiert. Sie können jedoch auch andere Optionen verwenden, wenn Sie möchten.

Das ist alles, was Sie für das grundlegende Verhalten brauchen. Wenn Sie Ihre Ansichten wie in docs beschrieben mit dem login_required-Dekorator umschließen, wird er jedes Mal auf Ihre Anmeldeseite umgeleitet, wenn ein nicht authentifizierter Benutzer versucht, auf eine Ihrer Ansichten zuzugreifen. Wenn Sie klassenbasierte Ansichten verwenden, verwenden Sie @method_decorator(login_required) als dokumentiertes hier . Zwei weitere Ausschnitte aus meinem Projekt:

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

In den Dokumenten werden einige kompliziertere Setups besprochen, falls Sie diese benötigen.

13
Peter DeGlopper

Ich empfehle Django-registration es ist ganz einfach. Dort ist auch eine E-Mail-Bestätigung.

sie benötigen einen Zusatz url sagen Sie nach Hause:

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

der Zugriff views, home war nur angemeldeten Benutzern vorbehalten

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

sie brauchen nicht csrf in login.py

dh:

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

reicht aus, da render das csrf-token übergeben wird.

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

Sie können das eingebaute Anmeldeformular von Django verwenden. Es ist einfach und effizient zu beenden. Außerdem erhalten Sie einige Funktionen wie die Formularüberprüfung.

in urls.py:

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

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

in HTML-Seite: 

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

Django verwenden 1.11. Ich hatte gerade das gleiche Problem, hier ist was für mich gearbeitet hat ...

Importieren Sie die Login-Ansichtsklasse aus der integrierten Authentifizierungsanwendung, und übergeben Sie Ihre Vorlagendatei über template_name kwarg.

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

Und in Ihrer Ansicht können Sie die Formularvariable verwenden, um Ihr Formular darzustellen. In meinem Fall benutze ich bootstrap so.

In 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

Ich habe die Lösung gefunden.

passen Sie zuerst die An- und Abmeldeansichten an:

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

Dann sollten Sie in Ihrer base.html folgendes machen:

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>

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

Eigentlich nehmen Sie Eingaben auf der Startseite und geben sie auf der Anmeldeseite für die Eingabefehlerbehandlung an.

0
armin