Django의 nested form fields 정보

현재 나는 세 개의 모델이 있는데, 예를 들어 아래에 열거한 간략한 모델 정의와 같다
class Article(models.Model):
     title...
     content...

class Attachment(models.Model):
     file...
     article = models.ForeignKey(Article, ref_name = 'attachments')

class Photo(models.Model):
     image...
     article = models.ForeignKey(Article, ref_name = 'photos')

현재 요구 사항은, 내가 새로운article를 만들 때, 이article에 그림이나 첨부 파일이 있다면, 한form에서 서버에 같이post하고,새로운article를 만든 후에 첨부된 첨부 파일이나 사진을 함께 저장할 수 있습니다.
Rails에서 아주 편리한 해결 방안이 하나 있는데, 바로 모델에서accepts를 정의하는 것이다nested_attributes_for, 이어서 html에서fields 사용 가능for 태그.
Django에서 사용된 inline formset은
inline formset의 생성은
inlineformset_factory
:
inlineformset_factory(parent_model,model,form=ModelForm,
    formset=BaseInlineFormSet,fk_name=None,
    fields=None,exclude=None,
    extra=3,can_order=False,can_delete=True,max_num=None,
    formfield_callback=None,widgets=None,validate_max=False)

이 예에서parent모델에는 Article, 모델에는 Attachment 또는 Photo
AttachmentInlineFormset = inlineformset_factory(Article, Attachment, extra = 1)
PhotoInlineFormset = inlineformset_factory(Article, Photo, extra = 1)

inline formset 인스턴스화:
attachment_formset = AttachmentInlineFormset(**self.get_form_kwargs(), prefix = 'attachments')
photo_formset = PhotoInlineFormset(**self.get_form_kwargs(), prefix = 'photos')

CreateView 또는 UpdateView에서
class XXView(CreateView):   
     def form_valid(self, form):
         instance = form.save(commit = False)
         attachment_formset = AttachmentInlineFormset(instance = instance, prefix = 'attachments', **self.get_form_kwargs())
         photo_formset = PhotoInlineFormset(instance = instance, prefix = 'photos', **self.get_form_kwargs())
         if attachment_formset.is_valid() and photo_formset.is_valid():
             instance = form.save()
             for fs in [attachment_formset, photo_formset]:
                 fs.instance = instance
                 fs.save()
             return HttpResponseRedirect(self.get_success_url())
         else:
             return self.form_invalid(self, form)

좋은 웹페이지 즐겨찾기