Форум сайта python.su
0
всем привет,
код из книжки:
from django import oldforms as forms
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.contrib.auth.forms import UserCreationForm
def register(request):
form = UserCreationForm()
if request.method == 'POST':
data = request.POST.copy()
errors = form.get_validation_errors(data)
if not errors:
new_user = form.save(data)
return HttpResponseRedirect("/books/")
else:
data, errors = {}, {}
return render_to_response("registration/register.html", {
'form' : forms.FormWrapper(form, data, errors)
})
Request URL: http://127.0.0.1:8000/accounts/register/
Exception Type: ImportError
Exception Value: cannot import name oldforms
Офлайн
0
oldforms больше не используютя. Вместо его используйте django.forms
Книжку правда придется выбросить, потому что новые формы работают совсем по другому
Офлайн
0
SvartalFуже заметил, что работают по другому!
Книжку правда придется выбросить, потому что новые формы работают совсем по другому
errors = form.get_validation_errors(data)
return render_to_response("registration/register.html", {
'form' : forms.FormWrapper(form, data, errors)
})Офлайн
0
Офлайн
0
могу предположить что второй код должен быть таким (но и то сомневаюсь, что переменная errors не передается в форму!):
return render_to_response("registration/register.html", {
'form' : 'data'})Офлайн
0
сделал упрощенный вариант
def register(request):
form = UserCreationForm()
if request.method == 'POST':
data = request.POST.copy()
new_user = form.save(data)
return HttpResponseRedirect("/books/")
else:
data, errors = {}, {}
return render_to_response("registration/register.html", {
'form' : form
})
class UserCreationForm(forms.ModelForm):
"""
A form that creates a user, with no privileges, from the given username and password.
"""
username = forms.RegexField(label=("Username"), max_length=30, regex=r'^\w+$',
help_text = ("Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."),
error_message = ("This value must contain only letters, numbers and underscores."))
password1 = forms.CharField(label=("Password"), widget=forms.PasswordInput)
password2 = forms.CharField(label=("Password confirmation"), widget=forms.PasswordInput)
class Meta:
model = User
fields = ("username",)
def clean_username(self):
#username = self.cleaned_data["username"]
try:
User.objects.get(username=username)
except User.DoesNotExist:
return username
raise forms.ValidationError(("A user with that username already exists."))
def clean_password2(self):
#password1 = self.cleaned_data.get("password1", "")
password1 = self.clean.get("password1", "")
password2 = self.clean["password2"]
if password1 != password2:
raise forms.ValidationError(("The two password fields didn't match."))
return password2
def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
#user.set_password(self.cleaned_data["password1"])
user.set_password(self.clean["password1"])
if commit:
user.save()
return user
Request Method: POST
Request URL: http://127.0.0.1:8000/accounts/register/
Exception Type: AttributeError
Exception Value:
'UserCreationForm' object has no attribute 'cleaned_data'
Exception Location: C:\Python25\lib\site-packages\django\forms\models.py in save_instance, line 38
Python Executable: C:\Python25\python.exe
Python Version: 2.5.2
cleaned_data = form.cleaned_data
Отредактировано (Ноя. 10, 2008 12:33:28)
Офлайн
2
Товарищ, читай документацию смело,
Она тебе поможет умело!
http://docs.djangoproject.com/en/dev/topics/forms/#using-a-form-in-a-view
is_valid() надо вызывать перед тем как с данными работать.
Офлайн
0
переделал view.py
from django.db.models import Q
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect, HttpResponse
from django.contrib import auth
from django.contrib.auth.views import login, logout
from django.contrib.auth.forms import UserCreationForm
from models import Book
def register(request):
if request.method == 'POST':
print "request.POST %s"%request.POST
form = UserCreationForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
print "username %s"%username
password1 = form.cleaned_data['password1']
print "password1 %s"%password1
password2 = form.cleaned_data['password1']
print "password2 %s"%password2
form.clean_username()#вызываем метод чтобы проверить зарегистрирован пользователь или нет?
if password1 == password2:
new_user = form.save()
else:
print "какую переменную передать в форму и вывести сообщение о несовпадающих паролях?"
form.ValidationError(_("A user with that username already exists."))
else:
print "form is not valid"
return HttpResponseRedirect("/accounts/login/")
else:
form = UserCreationForm()
return render_to_response("registration/register.html", {
'form' : form
})
{% block content %}
<h1>Регистрация пользователя</h1>
<form action="." method="post">
{% if form.error_dict %}
<p class="error">Пожалуйста исправьте нижеприведённые ошибки.</p>
{% endif %}
{% if form.username.errors %}
{{ form.username.html_error_list }}
{% endif %}
<label for="id_username">Логин:</label> {{ form.username }}
{% if form.password1.errors %}
{{ form.password1.html_error_list }}
{% endif %}
<label for="id_password1">Пароль: {{ form.password1 }}
{% if form.password2.errors %}
{{ form.password2.html_error_list }}
{% endif %}
<label for="id_password2">Пароль (снова): {{ form.password2 }}
<input type="submit" value="Зарегистрировать" />
</label>
{% endblock %}class UserCreationForm(forms.ModelForm):
"""
A form that creates a user, with no privileges, from the given username and password.
"""
username = forms.RegexField(label=_("Username"), max_length=30, regex=r'^\w+$',
help_text = _("Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."),
error_message = _("This value must contain only letters, numbers and underscores."))
password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
password2 = forms.CharField(label=_("Password confirmation"), widget=forms.PasswordInput)
class Meta:
model = User
fields = ("username",)
def clean_username(self):
username = self.cleaned_data["username"]
try:
User.objects.get(username=username)
except User.DoesNotExist:
return username
raise forms.ValidationError(_("A user with that username already exists."))
def clean_password2(self):
password1 = self.cleaned_data.get("password1", "")
password2 = self.cleaned_data["password2"]
if password1 != password2:
raise forms.ValidationError(_("The two password fields didn't match."))
return password2
def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
raise forms.ValidationError(_("The two password fields didn't match."))raise forms.ValidationError(_("A user with that username already exists."))Офлайн
2
Вы документацию читали? Или методом тыка?
Офлайн
0
Daevaornс сылочкой только сейчас ознакомился. до этого читал переведенную книжку (теперь понимаю что она устарела).
Вы документацию читали? Или методом тыка?
def register(request):
if request.method == 'POST':
print "request.POST %s"%request.POST
form = UserCreationForm(request.POST)
if form.is_valid():
try:
form.clean_username()
form.clean_password2()
new_user = form.save()
except:
print "was exception"
return HttpResponseRedirect("/accounts/login/")
else:
return HttpResponseRedirect("/accounts/register/")
else:
form = UserCreationForm()
return render_to_response("registration/register.html", {
'form' : form
})
Офлайн