LINUX.ORG.RU

django CreateView

 


0

1

Подскажите, пожалуйста, как в стандартную форму представление передать значение в одно из полей. Так, требуется в поле fields1 записать id залогиненого пользователя. Это id сохранено в переменную reg_user_id.

MyFormCreate(LoginRequiredMixin,generic.CreateView):
    model = MyModel
    fields = [ 'myfield2', 'myfield3' ]
    reg_user_id = ...
    myfield1 = reg_user # как-то передать значение

вроде в док. есть

 initial = { 'myfield1':23 }
не помогает Column 'myfield1' cannot be null" ..., чего-то еще найти не удается



Последнее исправление: iiivanov314 (всего исправлений: 1)

Ответ на: комментарий от lampslave

а можно поконкретнее - что вы имеете ввиду? зачем мне сессии? извлечь username или id .. у меня получалось.

я не могу найти полного примера или синтаксиса передачи в форму на базе CreateView конкретного начального значения в конкретное поле.

iiivanov314
() автор топика

Свали в хомячковый Web-development

anonymous
()
Ответ на: комментарий от lampslave

похоже только такой способ передачи данных работает. Данные даже сохраняются в таблицу.

Но, вылетает ошибка в return redurect:

class MyFormCreate(LoginRequiredMixin,CreateView):
    model = MyModel
    fields = [ 'f2', 'f3' ]
    success_url = '../'
    def form_valid(self, form):
        instance = form.save(commit=False)
        current_f1 = ... 
        instance.f1 = current_f1
        instance.save()
        return redirect(self.get_success_url())

Exception Type: 	AttributeError
Exception Value: 	'NoneType' object has no attribute '__dict__'
Exception Location: 	in get_success_url, line 133
iiivanov314
() автор топика
Ответ на: комментарий от lampslave

с инициализацией нихрена не работает. Разъясните мне что не так? По документации делаю:

вариант 1

class MyFormCreate(LoginRequiredMixin,generic.CreateView):
    model = MyModel
    fields = [ 'f2', 'f3' ]
    success_url = '../'
    initial = { 'f1': 23 }

Exception Type: 	IntegrityError
Exception Value: 	(1048, "Column 'f1' cannot be null")

вариант 2.

class MyFormCreate(LoginRequiredMixin,generic.CreateView):
    model = MyModel
    fields = [ 'f2', 'f3' ]
    success_url = '../'
    def __init__(self, *args, **kwargs):
        super(MyFormCreate, self).__init__(*args, **kwargs)
        self.fields['f1'].initial = 23

Exception Type:  TypeError
Exception Value: list indices must be integers, not str

c form_valid хотябы в базу данные сохраняет ...

iiivanov314
() автор топика

Опиши подробней откуда ты берешь значение и нахрена его пихать в поле формы? Ты хочешь его записать перед рендерингом пользователю или уже после отсылки POST от юзера к твоей джанге?

menangen ★★★★★
()
Ответ на: комментарий от menangen

Значение - это id из расширенного профиля залогиненного пользователя (оно вычисляется правильно). Его нужно сохранять (после POST) в базе данных. Т.е. юзер заполнил другие поля и в таблицу ушли значения, заполненные юзером + id сомого юзера из его расширенного профиля.

iiivanov314
() автор топика
Ответ на: комментарий от menangen

вот этот код работает и сохраняет все правильно в таблицу БД, но только я не понимаю почему возникает ошибка и как исправить

class MyFormCreate(LoginRequiredMixin,CreateView):
    model = MyModel
    fields = [ 'f2', 'f3' ]
    success_url = '../'
    def form_valid(self, form):
        instance = form.save(commit=False)
        current_f1 = ... 
        instance.f1 = current_f1
        instance.save()
        return redirect(self.get_success_url())

Exception Type: 	AttributeError
Exception Value: 	'NoneType' object has no attribute '__dict__'
Exception Location: 	in get_success_url, line 133

iiivanov314
() автор топика
Ответ на: комментарий от iiivanov314

Его нужно сохранять (после POST) в базе данных. Т.е. юзер заполнил другие поля и в таблицу ушли значения, заполненные юзером + id сомого юзера из его расширенного профиля.

Ну и где же тут initial? initial - начальные значения для формы, а не конечные. Конечные, в частности, меняются в методе clean самой модели https://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models....

Хотя в form_valid тоже можно.

lampslave ★★
()
Последнее исправление: lampslave (всего исправлений: 1)
Ответ на: комментарий от lampslave

почему возникает ошибка in get_success_url?

class MyFormCreate(LoginRequiredMixin,CreateView):
    success_url = '../'
    def form_valid(self, form):
        ...
        return redirect(self.get_success_url())

Exception Value: 	'NoneType' object has no attribute '__dict__'
iiivanov314
() автор топика
Ответ на: комментарий от iiivanov314

Потому, что в экземпляре, он же self нет метода self.get _success_url().

И что за классы LoginRequiredMixin,CreateView? Зачем в названии класса формы слово Create? Это же просто класс, а не экшен контроллер. Ты уверен, что у тебя экземпляр формы создается верно? Что насчёт поставить пичарм и продебажить твою строку с ошибкой?

menangen ★★★★★
()

По-моему, тебе надо в твоей форме создать метод save и в нём часть даных взять из cleaned_data, а часть из session.user.id .

menangen ★★★★★
()
Ответ на: комментарий от iiivanov314

В питоне, если класс наследуется от другого класса, через super можно вызвать родительский метод. Работает примерно так: https://github.com/lampslave/blog/blob/master/lbe/views.py#L100

Только вот почему у вас в родителях формы view-классы? Модельная форма не должна от них наследоваться.

lampslave ★★
()
Ответ на: комментарий от menangen

я пробую воспользоваться формами моделей Model Forms.

вернул super(MyFormCreate, self).form_valid(form) и все заработало !

iiivanov314
() автор топика
Ответ на: комментарий от lampslave

Опять нелады с UpdateView : - )

1. не хочет возвращаться на два уровня назад или по абсолютному url. Возвращается стандартно на один уровень (то есть ../ - от url отрезается только цифра)

Хотя в документации и то и то должно работать

http://djbook.ru/rel1.6/topics/class-based-views/generic-editing.html

«Вы можете не устанавливать значение success_url для классов CreateView или UpdateView - они воспользуются методом get_absolute_url() объекта модели (если такой объект доступен).»

2. в каком методе MyFormUpdate я должен выполнить проверку того, что юсер править свою запись. В таблице есть поле ex_user_profile_id?

class MyModel(models.Model):
    ex_user_profile =  models.ForeignKey(ExUserProfile)
    ...

    def __unicode__(self):
        return self.exuserprofile.last_name

    def get_absolute_url(self):
#        return reverse('user_detail')
        return reverse_lazy('user_detail')

class MyFormUpdate(generic.UpdateView):
    model = MyModel
    fields = [ ... ]
    success_url = '../../'
iiivanov314
() автор топика
Ответ на: комментарий от iiivanov314

Не надо этой магии с ../../ У вас в urls.py наверняка есть нужный адрес и вам никто не мешает использовать reverse и здесь тоже.

Лично я бы всю логику засунул в clean модели, а про формы вспоминал только при крайней необходимости.

lampslave ★★
()
Ответ на: комментарий от lampslave

а можно поподробнее с reverse - в док. нет такого метода у Model Form.

в urls.py есть name='user_detail', ему соответствует url r'^user/$'.

перебрал все success_url = 'user_detail', success_url = 'user/' ... - переброс стандарный (т.е. ../ )

class MyFormUpdate(generic.UpdateView):
    model = MyModel
    redirect_field_name = 'user_detail'
    success_url = 'user_detail'
    ...
iiivanov314
() автор топика
Ответ на: комментарий от lampslave

не работает:

class MyFormUpdate(generic.UpdateView):
    model = MyForm
    redirect_field_name = 'user_detail'
    success_url = 'user_detail'
    ...
    def get_success_url(self):
        return reverse('user_detail')

url(r'^exuser/$', views.ExUserProfileFormView.as_view(), name='user_detail')

iiivanov314
() автор топика
Ответ на: комментарий от iiivanov314

А с какой радости оно на update должно редиректить, когда прописано r'^exuser/$' ?

Вот это теперь зачем?

redirect_field_name = 'user_detail'
success_url = 'user_detail'

lampslave ★★
()
Ответ на: комментарий от lampslave

это я экспериментировал, исправлял ... и ответил на вопрос анонимуса - «что не работает?»

Еще раз, success_url - это адрес на который мы должны перейти после update. Пример ниже сделан по документации к django 1.6 (http://djbook.ru/rel1.6/topics/class-based-views/generic-editing.html). На 'user_detail' у меня висит другое представление - оно работает.

class MyFormUpdate(LoginRequiredMixin,generic.UpdateView):
    model = MyModel
    success_url = reverse_lazy('user_detail')

url(r'^profile/$', views.ExUserProfileView.as_view(), name='user_detail'),

После заполения формы update и нажатия «Готово» выполняется переход на http://127.0.0.1:8000/myapp1/profile/myformupdate/. Соответственно это приводит к ошибке Page not found.

Почему?

мне нужно в /myapp1/profile/

P.S.1 на update как раз все нормально редиректится, и представление MyFormUpdate вызывается. А вот после его работы нет правильного возврата.

P.S.2 покажите мне правильный пример, в котором после update происходит переход и используется

iiivanov314
() автор топика
Ответ на: комментарий от iiivanov314

success_url не может быть динамическим, т.е. reverse с ним использовать нельзя. Для динамики используется get_success_url, где reverse использовать можно.

lampslave ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.