2017-05-22 21 views
2

私はいくつかの画像で記事を作成できるフォームが必要です。私はimageフィールドにdjango-multiuploadアプリを使用しています。私はいくつかの画像を選択することができますが、フォームを提出しようとすると画像フィールドの下にメッセージがあります:"Field is empty and field is required"。私のミスはどこですか?イメージフィールドが空でない場合、なぜ私はそのようなメッセージを持っていますか?djangoに複数のファイルを正しく保存するには?

また、複数の画像を保存するためのアドバイスやアプリがあります。私はどんな助けにも非常に感謝しています。

models.py:

class Article(models.Model): 
    description = models.TextField(_('Description')) 

class Image(models.Model): 
    article= models.ForeignKey(Article, on_delete=models.CASCADE) 
    image = models.FileField(_('Image'), upload_to='images/%Y/%m/%d/') 

forms.py:

class ArticleForm(forms.ModelForm): 
    class Meta: 
     model = Article 
     fields = ('description',) 

    image = MultiFileField() 

    def save(self, commit=True): 
     instance = super(ArticleForm, self).save(commit) 
     for each in self.cleaned_data['image']: 
      Image.objects.create(image=each, article=instance) 
     return instance 

views.py:

def article_add(request): 
    data = dict() 
    if request.method == 'POST': 
     article_form = ArticleForm(request.POST, request.FILES) 
     if article_form.is_valid(): 
      article = article_form.save(commit=False) 
      ****** 
      article.save() 
      data['form_is_valid'] = True 
      articles = Article.objects.all 
      context = {'articles': articles} 
      context.update(csrf(request)) 
      data['html_article'] = render_to_string('project/article_list.html', context) 
     else: 
      data['form_is_valid'] = False 
    else: 
     article_form = ArticleForm() 
    context = {'article_form': article_form} 
    data['html_article_form'] = render_to_string('project/article_add.html', context, request=request) 
    return JsonResponse(data) 

article_add.html:画像フィールド上の

{% load widget_tweaks %} 

<form method="post" action="{% url 'article_add' %}" class="article-add-form"> 
    {% csrf_token %} 

    {% for field in article_form %} 
    <div class="form-group{% if field.errors %} has-danger{% endif %}"> 
     <label class="form-control-label" for="{{ field.id_for_label }}">{{ field.label }}</label> 
     {% render_field field class="form-control" %} 
     {% for error in field.errors %} 
      <div class="form-control-feedback">{{ error }}</div> 
     {% endfor %} 
    </div> 
    {% endfor %} 

    <button type="submit">Submit</button> 
</form> 

答えて

0

を増やしてみてください "MIN_NUM" 制約、

image = MultiMediaField(min_num=1, media_type='image') 

EDIT

def article_add(request): 
    if request.method == 'POST': 
     article_form = ArticleForm(request.POST, request.FILES) 
     if article_form.is_valid(): 
      article = article_form.save(commit=False) 
      ****** 
      article.save() 
      #assume you have already a view in the name 'article_list'. 
      return redirect('article_list') 
    else: 
     article_form = ArticleForm() 
    context = dict(article_form=article_form) 
    return render(request, 'project/article_add.html', context) 

あなたがレンダリングしようとしていたので多分問題単一のビューで2つのテンプレート、またdjangoテンプレートレンダリングを使用する場合レンダリングは、ショートカット関数です。これは、文字列の変換とjsonへの解析ではなく、使用することが最も一般的です。

また、 'article_list'はすべての記事のリストを表示する別のビューでなければなりません。新しい記事を追加した後、リストビューにリダイレクトすることを検討する必要があります。ここでは、複数のテンプレートを単一のビューでレンダリングしようとしていました。

def article_list(request): 
    articles = Article.objects.all() 
    context = dict(articles=articles) 
    return render(request, 'project/article_list.html', context) 

これは私の個人的な意見ですが、これは私の個人的な意見です。このアプローチを試してみてください...

+0

私はこのエラーがあります: 'TypeError:__init __()は予期せぬキーワード引数 'media_type''を持っています –

+0

ああ、それはMultiMediaField()のことです。イメージはあなたではありませんか? MultiFileFieldを使用してアップロードすることができるファイルタイプをアップロードできるのは、 – zaidfazil

+0

またはMultiImageField()です。 – zaidfazil

関連する問題