장고 프레임 워크를 배우고 있습니다. 다시 한 번 장보기 기능을 사용하는 대신 장고 기능을 사용하겠습니다. 모델 양식을 사용하기 시작했고 오류가있을 경우 표시되는 raise ValidationError
기능을 보았습니다. 나는 간단한 사용자 로그인 및 등록 양식을 작성 진형하고 다음과 같습니다Django ModelForm ValidationError가 웹 페이지에 표시되지 않습니다.
Models.py
from __future__ import unicode_literals
from django.db import models
from django.core.exceptions import ValidationError
import re, bcrypt
def check_uname(value):
if not re.match('^[.a-zA-Z0-9_]+$', value):
raise ValidationError('Invalid Username')
def check_passwd(value):
if len(value) < 8 and not re.search(r'[A-Z]', value) and not re.search(r'[a-z]', value) and not re.search(r'[0-9]', value):
raise ValidationError('Invalid Password')
def login(uname, passwd):
there = User.objects.filter(user_name=uname).values()
if there:
if bcrypt.hashpw((passwd).encode(), there[0]['password'].encode()) != there[0]['password'].encode():
return "wrong"
else:
return there
else:
return "wrong"
class User(models.Model):
full_name = models.CharField(max_length=45)
user_name = models.CharField(max_length=45, validators=[check_uname])
email = models.EmailField(max_length=100)
password = models.CharField(max_length=100, validators=[check_passwd])
created_at = models.DateTimeField(auto_now_add = True)
updated_at = models.DateTimeField(auto_now = True)
Forms.py
from django import forms
from .models import User
from django.core.exceptions import ValidationError
import bcrypt
from django.db.models import Q
class loginForm(forms.ModelForm):
class Meta:
model = User
fields = ['user_name', 'password']
exclude = ['full_name', 'email']
widgets = {
'password': forms.PasswordInput(),
}
class regForm(forms.ModelForm):
password2 = forms.CharField(max_length=100, label="Comfirm password", required=True, widget=forms.PasswordInput())
class Meta:
model = User
fields = ['full_name', 'user_name', 'email', 'password']
widgets = {
'password': forms.PasswordInput(),
}
def clean(self):
if self.cleaned_data['password'] != self.cleaned_data['password2']:
print "Passwords do not match"
raise forms.ValidationError("Passwords do not match")
else:
user = User.objects.filter(Q(user_name=self.cleaned_data['user_name']) | Q(email=self.cleaned_data['email']))
if user:
print "Username or Email already in use"
raise forms.ValidationError("Username or Email already in use")
else:
print ("hashing password")
unhashed_passwd = self.cleaned_data['password'].encode()
self.cleaned_data['password'] = bcrypt.hashpw(unhashed_passwd, bcrypt.gensalt())
return (regForm, self).clean(*args, **kwargs)
보기. 파이
from django.shortcuts import render, redirect
from django.contrib import messages
from . import forms
from . import models
import bcrypt
def login(request):
if 'user_id' not in request.session:
context = {'loginForm':forms.loginForm, 'regForm':forms.regForm}
if request.method == "POST" and 'password2' in request.POST:
reg_Form = forms.regForm(request.POST or None)
if reg_Form.is_valid():
print "It is inside valid"
print errors
reg_Form.save()
else:
form = forms.loginForm(request.POST or None)
if form.is_valid():
user_info = models.login(form.cleaned_data['user_name'], form.cleaned_data['password'])
if user_info == "wrong":
messages.error(request, 'Username or Password is invalid.')
else:
request.session['user_id'] = user_info[0]['id']
return render(request, 'index.html', context)
else:
return redirect('/')
템플릿
<!DOCTYPE HTML>
<html>
<head>
<title></title>
<meta charset="utf-8">
{% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{% static 'styles.css' %}">
{% load bootstrap3 %}
{% bootstrap_css %}
{% bootstrap_javascript %}
</head>
<body>
<nav class="navbar navbar-inverse navbar-top">
<div class="container">
<a class="navbar-brand" href="#">Ketan.io</a>
</div>
</nav>
{% bootstrap_messages %}
<div class="container">
<div class="row col-md-6">
<ol class="breadcrumb">
<h3><li>Login</li></h3>
</ol>
<form action="/login/" method="post" class="form-inline">
{% csrf_token %}
{% bootstrap_form_errors loginForm %}
{% bootstrap_form loginForm show_label=False %}
{% bootstrap_button "Login" button_type="submit" button_class="btn-primary" %}
</form>
</div>
<div class="margin_left col-md-6">
<ol class="breadcrumb">
<h3><li>Register</li></h3>
</ol>
<form action="/login/" method="post" class="form">
{% csrf_token %}
{% bootstrap_form_errors regForm %}
{% bootstrap_form regForm show_label=False %}
{% bootstrap_button "Register" button_type="submit" button_class="btn-primary" %}
</form>
</div>
</div>
</body>
</html>
내가 뭔가 잘못하고 있어요 알려 주시기 바랍니다! ValidationError
이 HTML에 나타나기를 바랍니다. 나는 또한 검증 문 (print statements)의 도움을 받아 검사를하고 있기 때문에 유효성 검사가 작동하고 있다고 확신한다. 나는 이것에 아주 새롭고 아직도 배우고있다. 나는 아직 모범 사례를 사용하지는 않을 것이지만 실천을 통해 확실히 개선 될 것입니다.
안부와 환호.