Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Унаследованные модели - несправедливость! [RSS Feed]

#1 Май 29, 2012 21:53:27

Diaspors
Зарегистрирован: 2012-05-18
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Унаследованные модели - несправедливость!

Всем доброго дня. Столкнулся с проблемкой:
Имея унаследованную модель

class ExtendetUser(User):
    active = models.NullBooleanField()
    active_link = models.CharField(max_length=20, verbose_name=u'Ключ активации', blank=True)

И следующую форму:
class MExtendetUserForm(ModelForm):
    username = forms.CharField(max_length=30, label = u'Никнейм', required = False)
    first_name = forms.CharField(max_length=30, label = u'Имя', required = False)
    last_name = forms.CharField(max_length=30, label = u'Фамилия', required = False)
    email = forms.EmailField(label = u'Email', required = False)
    class Meta:
        model = ExtendetUser
        fields = ('first_name', 'last_name', 'email')

При стандартной подстановке
user = ExtendetUser.objects.get(id=1)
form = MExtendetUserForm(instance=user)
form.is_valid() - говорит, что falce, хотя я четко в форме прописал что required = False
А form.errors говорит {}.

Офлайн

#2 Май 30, 2012 09:13:05

Chern
От: Киев
Зарегистрирован: 2010-09-15
Сообщения: 71
Репутация: +  3  -
Профиль   Отправить e-mail  

Унаследованные модели - несправедливость!

Diaspors
form.is_valid() - говорит, что falce, хотя я четко в форме прописал что required = False
А form.errors говорит {}.

Вы не передали данные форме, поэтому ей нечего валидировать(is_bound). Указание instance при создании формы помогает сформировать initial, и только



Офлайн

#3 Май 30, 2012 10:35:08

Diaspors
Зарегистрирован: 2012-05-18
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Унаследованные модели - несправедливость!

Может я не стой стороны пытаюсь понять! Но…:

print form.as_ul()
Расписывает заполненные поля… как так получается, что данные не передались ?
можно конечно без валидации передать initial-ом и из POST все изменения вытащить, но все таки хотелось, что бы проходило через форму! Подскажите как правильно сделать…

Офлайн

#4 Май 30, 2012 10:49:43

Chern
От: Киев
Зарегистрирован: 2010-09-15
Сообщения: 71
Репутация: +  3  -
Профиль   Отправить e-mail  

Унаследованные модели - несправедливость!

Diaspors
Расписывает заполненные поля… как так получается, что данные не передались ?
Пример. Редактирование профиля.
При GET запросе - создаем форму
form = MExtendetUserForm(instance=user)
и рендерим её в шаблон.
При POST запросе обрабатываем то, что прислал бразуер
form = MExtendetUserForm(data=request.POST)

Как я уже писал, указание instance при создании формы, сформирует initial данные, которые будут использованы при рендеринге.

При валидации данных обрабаывается только form.data



Отредактировано Chern (Май 30, 2012 10:51:07)

Офлайн

#5 Май 30, 2012 11:46:32

Diaspors
Зарегистрирован: 2012-05-18
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Унаследованные модели - несправедливость!

Chern пасибо, это доступно понятно и это все работает!
Я начинающий и поэтому не совсем понимаю, почему я не могу использовать такой сценарий:
при:

form = MExtendetUserForm(instance=user)
и вьюшке
form = MExtendetUserForm(request.POST)
if request.method == 'POST' and form.is_valid():
            user_ch = MExtendetUserForm(
                id=request.user.id,
                first_name=form.cleaned_data['first_name'],
                last_name=form.cleaned_data['last_name'],
                email=form.cleaned_data['email'],
                )
            user_ch.save()
то у меня валятся ошибки: “не можете использовать cleaned_data” (это понятно, так как form.is_valid() - False) вот это самое непонятное - почему - когда я передал в форму данные и как писал ранее все поля заполняются при отображении form.as_ul().
Как так получается, is_valid() - false, а as_ul() говорят, что все поля заполнены ?!?!

Офлайн

#6 Май 30, 2012 11:58:52

Diaspors
Зарегистрирован: 2012-05-18
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Унаследованные модели - несправедливость!

Вообще же как по документации должно быть еще проще:

form = MExtendetUserForm(request.POST)
if request.method == 'POST' and form.is_valid():
    form.save()

Офлайн

#7 Май 30, 2012 12:15:44

Chern
От: Киев
Зарегистрирован: 2010-09-15
Сообщения: 71
Репутация: +  3  -
Профиль   Отправить e-mail  

Унаследованные модели - несправедливость!

Смешались в кучу кони, люди (с) :)

Самый банальный пример для понимания

if request.method == 'POST':
    # В качестве первого параметра(он же form.data впоследствии) указываем POST. 
    # Именно эти данные будут валидироваться
    form = MExtendetUserForm(request.POST)
    if form.is_valid():
        new_user = form.save()
else:
    # Здесь мы инициализируем данные, чтобы впоследствии они к нам вернулись
    # Используем related_name (extendetuser) созданный при наследовании.
    form = MExtendetUserForm(instance=request.user.extendetuser)
    # В данном случае поле data - пустой словарь, соответственно валидировать нечего



Отредактировано Chern (Май 30, 2012 12:18:03)

Офлайн

#8 Май 30, 2012 12:18:16

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Унаследованные модели - несправедливость!

Diaspors
Вообще же как по документации должно быть еще проще:
form = MExtendetUserForm(request.POST)
if request.method == 'POST' and form.is_valid():
    form.save()
Объясняю на пальцах.
form = MyForm(instance=some_object)
Сия конструкция означает, что в шаблон будет передана форма, поля которой будут заполнены данными из объекта some_object. Но для валидации формы и сохранения данных в БД в форму должны быть переданы данные из request-а, иначе откуда фреймворк должен узнать, что какие-то новые данные пользователь забил в поля формы или изменил уже имеющиеся?

Резюме:
Когда форму отправляем пользователю, пишем так
form = MyForm(instance=some_object)

Когда получаем request, пишем так
form = MyForm(instance=some_object, request.POST)



Отредактировано FishHook (Май 30, 2012 12:19:58)

Офлайн

#9 Май 30, 2012 14:18:29

Diaspors
Зарегистрирован: 2012-05-18
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Унаследованные модели - несправедливость!

Ну вот теперь когда разжевано, теперь понятно! Всем спасибо!

Офлайн

  • Начало
  • » Django
  • » Унаследованные модели - несправедливость![RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version