2017-04-11 15 views
0

Mein urls.py ist so etwas wie dieses:Django Form selbst Validierung nicht funktioniert

from django.conf.urls import url 
from django.views.generic import ListView, TemplateView 

from .models import Dreamreal 
from . import views 
urlpatterns = [ 
    url(r'^connection/login/$', views.login), 
    url(r'^connection/$', TemplateView.as_view(template_name = 
    'login.html')), 
    url(r'^login/$', views.login, name = 'login') 
] 

Mein views.py ist:

from .forms import LoginForm 
from . import models 

def login(request): 
username = "not logged in" 

if request.POST: 
    # GET THE POSTED FORM 
    MyLoginForm = LoginForm(request.POST) 
    if MyLoginForm.is_valid(): 
     username = MyLoginForm.cleaned_data['username'] 
else: 
    MyLoginForm = LoginForm() 

return render(request, 'loggedin.html', {'username' : username}) 

Mein forms.py ist:

from django import forms 
from .models import Dreamreal 

class LoginForm(forms.Form): 
username = forms.CharField(max_length = 100) 
password = forms.CharField(widget = forms.PasswordInput()) 

# METHOD TO VERIFY IF USER IS IN DB 
def clean_message(self): 
    username = self.cleaned_data.get("username") 
    dbuser = Dreamreal.objects.filter(name = 'username') 

    if not dbuser: 
     raise forms.ValidationError("User does not exist in our db!") 

    return username 

Mein models.py ist:

from django.db import models 
class Dreamreal(models.Model): 
website = models.CharField(max_length = 50) 
mail = models.CharField(max_length = 50) 
name = models.CharField(max_length = 50) 
phonenumber = models.IntegerField() 

class Meta: 
    db_table = 'dreamreal' 

Mein login.html ist:

<html> 
<head> 
    <title>LOG IN</title> 
</head> 
<body> 
    <form name="form" action="/connection/login/" method="POST"> 
    {% csrf_token %} 
    <div style="max-width: 470px;"> 
     <center><input type="text" name="username" 
     placeholder="username" style="margin-left: 20%;" required> 
     </center> 
    </div> 
    <br> 
    <div style="max-width: 470px;"> 
     <center><input type="password" name="password" 
     placeholder="password" style="margin-left: 20%;"></center> 
    </div> 
    <br> 
    <div style="max-width: 470px;"> 
     <center><button style = "border:0px; background-color:#4285F4; 
     margin-top:8%; height:35px; width:80%;margin-left:19%;" type = 
     "submit" value = "Login" > 
       <strong>Login</strong> 
      </button></center> 
     </div> 

    </form> 

</body> 
</html> 

Mein loggedin.html ist:

{% extends 'base.html' %} 
<html> 
<head> 
<title>{% block title%}{{ username }}{% endblock %}</title> 
</head> 
<body> 
{% block content %} 
    You are : <strong>{{ username }}</strong> 
{% endblock %} 

Wenn ich den Code ausführen und dann den Namen und das Passwort in der Dield-Eingabe unter/connection/url eingeben, wird er auf/connectionslogin/url umgeleitet, aber er zeigt für alle Benutzernamen, die ich in die Formulare eingabe Zeige nur die Namen, die im Datenbanknamen Dreamreal gespeichert sind. Jemand bitte helfen!

+0

Beachten Sie, dass Django mit [Authentifizierungsansichten] (https://docs.djangoproject.com/en/1.10/topics/auth/default/#module-django.contrib.auth.views) und Formularen geliefert wird. Es wäre besser, diese zu verwenden, als deine eigenen zu schreiben. – Alasdair

Antwort

0

Sie bestätigen das Feld username, daher sollten Sie Ihre Methode clean_username benennen. Django ruft nur das Feld clean_message auf, wenn das Formular ein Feld mit dem Namen message enthält.

Um jegliche Formfehler in der Vorlage sehen Sie das Formular im Rahmen aufnehmen müssen, wenn Sie machen rufen:

return render(request, 'loggedin.html', {'username' : username, 'form': MyLoginForm} 

Und Sie werden die Fehler in der Vorlage nicht sehen, es sei denn, Sie form in der Verwendung Vorlage. Der einfachste Weg, dies zu tun, ist {{ form }}. Wenn Sie etwas weiter fortgeschrittenes tun müssen, finden Sie in der Dokumentation auf working with forms.

+0

Ich habe den Methodennamen in clean_username geändert, aber jetzt wird immer angezeigt, dass er nicht angemeldet ist. Es führt die Anweisung if MyLoginForm.is_valid() nicht aus. –

+0

Die Überprüfung ist normalerweise 'if request.method == 'POST':', aber ich glaube nicht, dass das das Problem erklärt. Ich kann Ihnen nicht helfen, diese Ansicht weiter zu debuggen. Wie ich bereits in meinem Kommentar vorgeschlagen habe, ist es einfacher und sicherer, die Login-Ansicht von Django zu verwenden, als deine eigene zu schreiben. – Alasdair

+0

Können Sie mir den vereinfachten Code dafür zur Verfügung stellen :-) Ich würde das schätzen: - –

Verwandte Themen