Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 25, 2013 14:27:00

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

formset сохранение данных

Есть представление:

        if request.method == 'POST':
            HousePhotoAddFormSet = formset_factory(HousePhotoAddForm, max_num=10)  
            formset = HousePhotoAddFormSet(request.POST, request.FILES) 
            if formset.is_valid():
                try:
                    house = House.objects.get(code=id)
                except House.DoesNotExist: 
                    return HttpResponseRedirect("/add/2/%s/" %(id))
                for form in formset:
                    photo = HousePhoto(house=house, **form.cleaned_data)
                    photo.save()
                    return HttpResponseRedirect("/add/3/%s/" %(id))
модель под него:
class HousePhoto(models.Model):
    house = models.ForeignKey(House, related_name='HousePhotoToHouse', unique=False, verbose_name=u'Объявление')
    photo = models.ImageField(upload_to='photo')
    description = models.CharField(max_length=140, unique=False, verbose_name=u'Комментарий')
            
    class Meta:
        verbose_name = (u'---Фотография---')
        verbose_name_plural = (u'---Фотографии---')
Передаю в нее несколько значений с помощью post, но сохраняется только первое каждый раз, не пойму, где я накосячил?



_________
Новичок

Отредактировано SorrowFuck (Янв. 25, 2013 14:55:11)

Офлайн

#2 Янв. 25, 2013 15:40:14

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

formset сохранение данных

покажи HousePhotoAddForm

Офлайн

#3 Янв. 25, 2013 19:07:18

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

formset сохранение данных

class HousePhotoAddForm (forms.Form):
    photo = forms.ImageField()
    description = forms.CharField(max_length=140, widget=forms.Textarea(attrs={ 
                                                                               'class': 'photo_description', 
                                                                               'placeholder': u'Краткое описание'}))  



_________
Новичок

Отредактировано SorrowFuck (Янв. 25, 2013 19:36:00)

Офлайн

#4 Янв. 26, 2013 02:44:44

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

formset сохранение данных

SorrowFuck
Передаю в нее несколько значений с помощью post, но сохраняется только первое каждый раз, не пойму, где я накосячил?

Потому что return стоит в цикле, вот цикл один раз и проходит - сохраняет только первое значение.
Вынеси за цикл)
for form in formset:
    photo = HousePhoto(house=house, **form.cleaned_data)
    photo.save()
    return HttpResponseRedirect("/add/3/%s/" %(id)) # вот тут 

Да… и делай перерывы, чтобы “глаз не замыливался”.

Отредактировано buddha (Янв. 26, 2013 02:47:51)

Офлайн

#5 Янв. 26, 2013 03:05:33

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

formset сохранение данных

Вот это спасибо, совсем не заметил, да, надо бы прерываться



_________
Новичок

Офлайн

#6 Янв. 26, 2013 09:40:59

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

formset сохранение данных

Почему-то форма не проходит проверку на валидность.

        if request.method == 'GET':
            data_dict = request.GET.dict()
            HousePhotoAddFormSet = formset_factory(HousePhotoAddForm, extra=data_dict['form-TOTAL_FORMS'], max_num=data_dict['form-TOTAL_FORMS'])  
            formset = HousePhotoAddFormSet(request.GET) 
            if formset.is_valid():
                try:
                    house = House.objects.get(code=id)
                except House.DoesNotExist: 
                    return HttpResponseRedirect("/add/2/%s/" %(id))
                for form in formset:
                    check = HousePhotoAddForm(form.cleaned_data)
                    if check.is_valid():
                        photo = HousePhoto(house=house, **form.cleaned_data)
                        photo.save()
                return HttpResponseRedirect("/add/3/%s/" %(id))
            else:
                return HttpResponseRedirect("/add/2/%s/" %(id))

Через дебагер смотрел, картинка и текст передаются в теле гет нормально.



_________
Новичок

Офлайн

#7 Янв. 26, 2013 14:01:43

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

formset сохранение данных

Вставь строчку кода, посмотри что выведет:

if request.method == 'GET':
            data_dict = request.GET.dict()
            HousePhotoAddFormSet = formset_factory(HousePhotoAddForm, extra=data_dict['form-TOTAL_FORMS'], max_num=data_dict['form-TOTAL_FORMS'])  
            formset = HousePhotoAddFormSet(request.GET) 
            print formset.errors               #посмотри , что за ошибки
            print formset.non_form_errors()  # обе строки выводят одну инфу, просто по разному
            if formset.is_valid():

Офлайн

#8 Янв. 30, 2013 11:42:20

SorrowFuck
От: Хабаровск
Зарегистрирован: 2012-10-10
Сообщения: 64
Репутация: +  2  -
Профиль   Отправить e-mail  

formset сохранение данных

formset.errors вернул

[{'photo': [u'Обязательное поле.']}]

дебагер показывает следующее:
GET Variables
Variable	Value
form-MAX_NUM_FORMS	
form-0-photo	9ВАРИАНТ.jpg
form-INITIAL_FORMS	0
form-0-description	fsddfs
form-TOTAL_FORMS	1

            data_dict = request.GET.dict()
            HousePhotoAddFormSet = formset_factory(HousePhotoAddForm, extra=data_dict['form-TOTAL_FORMS'], max_num=data_dict['form-TOTAL_FORMS'])  
            formset = HousePhotoAddFormSet(request.GET) 
            if formset.is_valid():
                try:
                    house = House.objects.get(code=id)
                except House.DoesNotExist: 
                    return HttpResponseRedirect("/add/2/%s/" %(id))
                for form in formset:
                    check = HousePhotoAddForm(form.cleaned_data)
                    if check.is_valid():
                        photo = HousePhoto(house=house, **form.cleaned_data)
                        photo.save()



_________
Новичок

Отредактировано SorrowFuck (Янв. 30, 2013 11:42:38)

Офлайн

#9 Янв. 30, 2013 21:05:44

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

formset сохранение данных

Так, во-первых не форма, а формсет не проходит валидацию. Попробую предположить, что ты не заполняешь экстра формы. На ошибку можно опираться…

И почему данные берёшь из GET запроса, а не из POST?

Офлайн

#10 Янв. 30, 2013 23:16:55

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

formset сохранение данных

В форму не передаете данные фото

formset = HousePhotoAddFormSet(request.GET)

formset = HousePhotoAddFormSet(request.POST, request.FILES)

вообще есть простые примеры в доках для работы с формcетами
https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#saving-objects-in-the-formset

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version