1

複数のインラインフォームセットを含むUpdateViewビューを作成しようとしています。ファイルや画像を追加したり削除したりすることができますが、何らかの理由でファイル/画像を受け入れないようになっています。たとえば、パブリケーションに2番目のファイルを追加してファイルをアップロードすると、このフィールドがFileFieldの隣に必要であることを示すform_invalid関数が返されます。画像と同じこと - 新しい画像を追加することはできません。また、このフィールドが必要であると言われるので、画像を別のファイルに変更することもできません。それ以外の出版物のフィールドはすべて変更することができますし、ファイルのタイトル、説明、バージョンも変更できますが、正しく保存されますが、新しいファイル/イメージを追加するか、何もしないと、無効なフォーム関数が返されます。Django formset UpdateViewでファイルをアップロードできません

models.py

class Publication(models.Model): 
    title = models.CharField('Tytul', max_length=100) 
    author = models.ForeignKey(User, verbose_name=('Author'), blank=True, default=0) 
    pub_date = models.DateTimeField('Data publikacji', default=datetime.now) 
    mod_date = models.DateTimeField('Data ostatniej modyfikacji', default=datetime.now) 
    description = models.CharField('Opis', max_length=450) 
    slug = models.SlugField(max_length=40, unique=True) 
    category = models.ForeignKey(Category, verbose_name=('Kategoria'), default=0, related_name='publication') 
    video = EmbedVideoField(blank=True) 

class File(models.Model): 
    title = models.CharField('Tytul', max_length=100) 
    version = models.CharField(verbose_name=u"Wersja", max_length=100) 
    author = models.ForeignKey(User, verbose_name=('Author'), blank=True, default=0) 
    pub_date = models.DateTimeField('Data publikacji', default=datetime.now) 
    mod_date = models.DateTimeField('Data ostatniej modyfikacji', default=datetime.now) 
    description = models.CharField('Opis', max_length=450) 
    downloads = models.IntegerField(default=0) 
    physicalfile = models.FileField('Wrzuc plik', upload_to=randomfilenames, validators=[validate_extension]) 
    publicationfk = models.ForeignKey(Publication,on_delete=models.CASCADE, related_name='files') 


class Image(models.Model): 
    publication = models.ForeignKey(Publication, related_name='images') 
    image = VersatileImageField('Wrzuc obrazek') 

forms.py

class FileForm(forms.ModelForm): 
    class Meta: 
     model = File 
     fields = ['title', 'version', 'description', 'physicalfile',] 

class ImgForm(forms.ModelForm): 
    class Meta: 
     model = Image 
     fields = ['image',] 

class PublicationForm(forms.ModelForm): 
    class Meta: 
     model = Publication 
     fields = ['title', 'description', 'slug', 'category',] 

fileformset = inlineformset_factory(Publication, File, form=FileForm, exclude=[],can_delete=True, extra=1) 
imageformset = inlineformset_factory(Publication, Image, form=ImgForm, can_delete=True, exclude=[], extra=1) 

views.py

class PublicationEdit(UpdateView): 
    model = Publication 
    form_class = PublicationForm 
    template_name = 'mods/pubedit.html' 

    def get_success_url(self): 
     self.success_url = reverse('mods:publicationview', args=(self.object.id,)) 
     return self.success_url 

    def get_context_data(self, **kwargs): 
     context = super(PublicationEdit, self).get_context_data(**kwargs) 
     if self.request.POST: 
      context['pubform'] = PublicationForm(self.request.POST, instance=self.object) 
      context['fileform'] = fileformset(self.request.POST, self.request.FILES, instance=self.object) 
      context['imgform'] = imageformset(self.request.POST, self.request.FILES, instance=self.object) 
     else: 
      context['pubform'] = PublicationForm(instance=self.object) 
      context['fileform'] = fileformset(instance=self.object) 
      context['imgform'] = imageformset(instance=self.object) 
     return context 

    def post(self, request, *args, **kwargs): 
     self.object = self.get_object() 
     form_class = self.get_form_class() 
     pubform = self.get_form(form_class) 
     fileform = fileformset(self.request.POST, self.request.FILES, instance=self.object) 
     imgform = imageformset(self.request.POST, self.request.FILES, instance=self.object) 

     if (pubform.is_valid() and fileform.is_valid() and imgform.is_valid()): 
      return self.form_valid(pubform, fileform, imgform) 
     else: 
      return self.form_invalid(pubform, fileform, imgform) 


    def form_valid(self, pubform, fileform, imgform): 
     self.object = pubform.save() 
     fileform.instance = self.object 
     fileform.save() 
     imgform.instance = self.object 
     imgform.save() 
     return HttpResponseRedirect(self.get_success_url()) 

    def form_invalid(self, pubform, fileform, imgform): 
     return self.render_to_response(self.get_context_data(pubform=pubform, 
            fileform=fileform, 
            imgform=imgform)) 
+1

フォームののenctype = "multipart/form-data" を設定しますか? – neverwalkaloner

+0

@neverwalkalonerまあ、いいえ、私はしませんでした。私はそれを完全に忘れてしまった。ありがとう、私は何時間も、私のコードで間違っていることを見つけようと努力しましたが、私はこの基本的なことを忘れていました。 – drakerc

+0

あなたは大歓迎です。私は答えとしてコメントを投稿しました。 – neverwalkaloner

答えて

1

である可能性が高い理由フォームのenctype属性を設定しません。 あなたが設定shoul enctype属性を次のようにファイルをアップロードするためのフォームを使用している場合:

<form method="post" enctype="multipart/form-data"> 
関連する問題