Найти - Пользователи
Полная версия: Унаследованные модели - несправедливость!
Начало » Django » Унаследованные модели - несправедливость!
1
Diaspors
Всем доброго дня. Столкнулся с проблемкой:
Имея унаследованную модель
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 говорит {}.
Chern
Diaspors
form.is_valid() - говорит, что falce, хотя я четко в форме прописал что required = False
А form.errors говорит {}.

Вы не передали данные форме, поэтому ей нечего валидировать(is_bound). Указание instance при создании формы помогает сформировать initial, и только
Diaspors
Может я не стой стороны пытаюсь понять! Но…:
print form.as_ul()
Расписывает заполненные поля… как так получается, что данные не передались ?
можно конечно без валидации передать initial-ом и из POST все изменения вытащить, но все таки хотелось, что бы проходило через форму! Подскажите как правильно сделать…
Chern
Diaspors
Расписывает заполненные поля… как так получается, что данные не передались ?
Пример. Редактирование профиля.
При GET запросе - создаем форму
form = MExtendetUserForm(instance=user)
и рендерим её в шаблон.
При POST запросе обрабатываем то, что прислал бразуер
form = MExtendetUserForm(data=request.POST)

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

При валидации данных обрабаывается только form.data
Diaspors
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() говорят, что все поля заполнены ?!?!
Diaspors
Вообще же как по документации должно быть еще проще:
form = MExtendetUserForm(request.POST)
if request.method == 'POST' and form.is_valid():
    form.save()
Chern
Смешались в кучу кони, люди (с) :)

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

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 - пустой словарь, соответственно валидировать нечего
FishHook
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)
Diaspors
Ну вот теперь когда разжевано, теперь понятно! Всем спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB