Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » код из книжки вызывает "cannot import name oldforms" в django 1.0 [RSS Feed]

#1 Ноя. 10, 2008 07:46:42

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

код из книжки вызывает "cannot import name oldforms" в django 1.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
ниже есть упоминание на http://www.djangoproject.com/documentation/0.96/forms/
но у меня django 1.0 а ссылка на версию 0.96. Как сделать простейшую форму регистрации юзеров?
P.S. в английском не очень силен, поэтому наверно по ссылке не нашел ответа на свой вопрос.



Офлайн

#2 Ноя. 10, 2008 08:44:30

SvartalF
От:
Зарегистрирован: 2008-06-29
Сообщения: 73
Репутация: +  0  -
Профиль   Отправить e-mail  

код из книжки вызывает "cannot import name oldforms" в django 1.0

oldforms больше не используютя. Вместо его используйте django.forms
Книжку правда придется выбросить, потому что новые формы работают совсем по другому



Офлайн

#3 Ноя. 10, 2008 09:11:15

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

код из книжки вызывает "cannot import name oldforms" в django 1.0

SvartalF
Книжку правда придется выбросить, потому что новые формы работают совсем по другому
уже заметил, что работают по другому!
как переписать данную процедуру под django 1.0?
например
как переписать
 errors = form.get_validation_errors(data)
,
 return render_to_response("registration/register.html", {
'form' : forms.FormWrapper(form, data, errors)
})



Офлайн

#4 Ноя. 10, 2008 09:23:52

SvartalF
От:
Зарегистрирован: 2008-06-29
Сообщения: 73
Репутация: +  0  -
Профиль   Отправить e-mail  

код из книжки вызывает "cannot import name oldforms" в django 1.0

Офлайн

#5 Ноя. 10, 2008 11:41:56

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

код из книжки вызывает "cannot import name oldforms" в django 1.0

могу предположить что второй код должен быть таким (но и то сомневаюсь, что переменная errors не передается в форму!):

return render_to_response("registration/register.html", {
'form' : 'data'})



Офлайн

#6 Ноя. 10, 2008 12:29:43

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

код из книжки вызывает "cannot import name oldforms" в django 1.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
посмотрел код C:\Python25\lib\site-packages\django\forms\models.py in save_instance, line 38
cleaned_data = form.cleaned_data
Неужели придется редактировать исходники django чтобы заработала такая обычная вещь как регистрация пользователя?
Подскажите как эту форму сделать?
Или проще отказаться от django 1.0 и перейти на предыдущую версию django?



Отредактировано (Ноя. 10, 2008 12:33:28)

Офлайн

#7 Ноя. 10, 2008 14:36:01

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

код из книжки вызывает "cannot import name oldforms" в django 1.0

Товарищ, читай документацию смело,
Она тебе поможет умело!

http://docs.djangoproject.com/en/dev/topics/forms/#using-a-form-in-a-view

is_valid() надо вызывать перед тем как с данными работать.



Офлайн

#8 Ноя. 11, 2008 07:27:46

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

код из книжки вызывает "cannot import name oldforms" в django 1.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
})
код “registration/register.html” приведен ниже:
{% 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
подскажите как вывести ошибки используя form.error_dict, form.username.errors, form.password1.errors, form.password2.errors например в случаях ввода несовпадающего пароля в поле подтверждения или ввода уже зарегистрированного логина?
нашел описание класса UserCreationForm в файле “c:\Python25\Lib\site-packages\django\contrib\auth\” по методам clean_username, clean_password2, но пока не могу добиться вывода об ошибках. Или проще сделать новую переменную - error и передавать ее в шаблон, чтобы сообщать об ошибках. Но тогда не понятно как использовать код
raise forms.ValidationError(_("The two password fields didn't match."))
и
raise forms.ValidationError(_("A user with that username already exists."))
написанный в классе UserCreationForm



Офлайн

#9 Ноя. 11, 2008 12:35:18

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

код из книжки вызывает "cannot import name oldforms" в django 1.0

Вы документацию читали? Или методом тыка?



Офлайн

#10 Ноя. 11, 2008 13:29:22

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

код из книжки вызывает "cannot import name oldforms" в django 1.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
})
признаю что с английским не очень хорошо, но по доке понял что для проверки правильности введенных данных необходимо вызвать методы
form.clean_username()
form.clean_password2()
но почему то сообщений об ошибке не выдает.
подскажите пожалуйста в чем ошибаюсь.



Офлайн

  • Начало
  • » Django
  • » код из книжки вызывает "cannot import name oldforms" в django 1.0[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version