class AdForm(forms.ModelForm): description = forms.CharField(widget=forms.Textarea(attrs={'id': 'description_redactor'}), label=_('Description')) contacts = forms.CharField(widget=forms.Textarea(attrs={'id': 'contacts_redactor'}), label=_('Contacts')) choises = [(unicode(t.name), [(s.id, unicode(s.name) ) for s in AdSubTag.objects.filter(tag = t)]) for t in AdTag.objects.all()] category = ChoiceField(label=_('Category'), choices = [('', '---------')] + choises ) # price = CapacityDecimalField(label=capitalize(_('price')), max_digits=12, decimal_places=2, help_text=u"руб.", # widget=forms.widgets.TextInput(attrs={"maxlength": 9})) def __init__(self, *args, **kwargs): super(AdForm, self).__init__(*args, **kwargs) if self.instance.pk: self.fields['category'].initial = self.instance.tags.all()[0].pk class Meta: model = Ad fields = ['is_visible', 'ad_type', 'category', 'title', 'price', 'description', 'contacts'] required_css_class = 'required_field' class AdImageForm(forms.ModelForm): class Meta: model = AdImage exclude = ('ad_article')
Есть вьюха и в ней обработчик:
def create(self, request, *args, **kwargs): if not request.user.is_authenticated(): return HttpResponseRedirect('/login?%s=%s' % (REDIRECT_FIELD_NAME, urlquote(request.get_full_path()))) form = AdForm(request.POST) AdImageFormSet = modelformset_factory(AdImage, form=AdImageForm, extra=5) formset = AdImageFormSet(request.POST, request.FILES) category = request.POST.get('category') if form.is_valid() and formset.is_valid() and category: category_obj = AdSubTag.objects.get(pk=request.POST['category']) ad = form.save(commit=False) ad.user = request.user ad.save() images = [i for i in map(lambda f: f.save(commit=False), formset) if i.image] ad.images = images for i in images: i.save() ad.tags = [category_obj] return HttpResponseRedirect(reverse('ad', kwargs={'pk': ad.pk})) else: return render(request, 'ads/new.html', locals())
Если в каком то поле первой формы делается ошибка, то картинки напрочь слетают, как подправить код для их сохранения