Найти - Пользователи
Полная версия: formset сохранение данных
Начало » Django » formset сохранение данных
1 2
SorrowFuck
Есть представление:
        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, но сохраняется только первое каждый раз, не пойму, где я накосячил?
inoks
покажи HousePhotoAddForm
SorrowFuck
class HousePhotoAddForm (forms.Form):
    photo = forms.ImageField()
    description = forms.CharField(max_length=140, widget=forms.Textarea(attrs={ 
                                                                               'class': 'photo_description', 
                                                                               'placeholder': u'Краткое описание'}))  
buddha
SorrowFuck
Передаю в нее несколько значений с помощью post, но сохраняется только первое каждый раз, не пойму, где я накосячил?

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

Да… и делай перерывы, чтобы “глаз не замыливался”.
SorrowFuck
Вот это спасибо, совсем не заметил, да, надо бы прерываться
SorrowFuck
Почему-то форма не проходит проверку на валидность.
        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))

Через дебагер смотрел, картинка и текст передаются в теле гет нормально.
buddha
Вставь строчку кода, посмотри что выведет:
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():
SorrowFuck
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()
buddha
Так, во-первых не форма, а формсет не проходит валидацию. Попробую предположить, что ты не заполняешь экстра формы. На ошибку можно опираться…

И почему данные берёшь из GET запроса, а не из POST?
inoks
В форму не передаете данные фото
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
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