Форум сайта python.su
всем привет,
код из книжки:
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
Офлайн
oldforms больше не используютя. Вместо его используйте django.forms
Книжку правда придется выбросить, потому что новые формы работают совсем по другому
Офлайн
SvartalFуже заметил, что работают по другому!
Книжку правда придется выбросить, потому что новые формы работают совсем по другому
errors = form.get_validation_errors(data)
return render_to_response("registration/register.html", {
'form' : forms.FormWrapper(form, data, errors)
})
Офлайн
Офлайн
могу предположить что второй код должен быть таким (но и то сомневаюсь, что переменная errors не передается в форму!):
return render_to_response("registration/register.html", {
'form' : 'data'})
Офлайн
сделал упрощенный вариант
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)
Офлайн
Товарищ, читай документацию смело,
Она тебе поможет умело!
http://docs.djangoproject.com/en/dev/topics/forms/#using-a-form-in-a-view
is_valid() надо вызывать перед тем как с данными работать.
Офлайн
переделал 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."))
Офлайн
Вы документацию читали? Или методом тыка?
Офлайн
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
})
Офлайн