2014-04-01 63 views
1

我正在使用Django模型表單寫一個簡單的視圖,但是圖像字段無法驗證'This field is required'錯誤消息。Django模型表單圖像字段不驗證

我不知道問題出在哪裏?

型號:

class Deal(AbstractModel): 
    IMAGE_MAX_LENGTH = 200 

    place = models.ForeignKey(Place, related_name='deals', related_query_name='deal', verbose_name=_("Place")) 
    image = models.ImageField(default='deals/default.png', max_length=IMAGE_MAX_LENGTH, upload_to='deals', verbose_name=_("Image")) 
    ... 

查看:

@login_required 
def deals_create(request): 
    # Get place id 
    place_id = request.GET.get('place') 
    # Get place 
    place = Place.objects.get(id=place_id) 
    # Process form data 
    if request.method == 'POST': 
     form = DealsCreateForm(request.POST, request.FILES) 
     # Validate post data 
     if form.is_valid(): 
      # Save deal data 
      deal = form.save(commit=False) 
      deal.place = place 
      deal.save() 
      # Redirect to reload page and clear post data 
      return HttpResponseRedirect(reverse('deal_manager:deals_pending')) 
    else: 
     form = DealsCreateForm() 
    return render(request, 'deal_manager/deals_create.html', { 
     'form': form, 
     'place': place, 
    }) 

形式:

class DealsCreateForm(ModelForm): 

    class Meta: 
     model = Deal 
     fields = [ 
      'image', 'product_name', 'product_description', 
      'regular_price', 'sale_price', 'limit', 'terms', 
     ] 

模板:

{% extends "deal_manager/deal_manager.html" %} 

{% load i18n %} 
{% load staticfiles %} 

{% block page_content_body %} 
     <div class="row"> 
      <div class="span12"> 
       <form action="{% url 'deal_manager:deals_create' %}?place={{ place.id }}" method="post"> 
        {% csrf_token %} 
        {{ form.as_p }} 
        <input type="submit" value="{% trans 'Create' %}" /> 
       </form> 
      </div> 
     </div> 
     <div class="gap gap-small"></div> 
{% endblock page_content_body %} 

注意:窗體驗證當我從表單元字段中刪除圖像字段。

注意:文件上傳對於此模型的Django Admin正常工作。

+0

你可以包括你的模板代碼? – patsweet

+0

我編輯了問題以包含模板代碼。 –

回答

3

您需要包含enctype="multipart/form-data"以將imagefield和filefield數據綁定到表單。沒有這些,這些字段將無法驗證。

{% block page_content_body %} 
     <div class="row"> 
      <div class="span12"> 
       <form enctype="multipart/form-data" action="{% url 'deal_manager:deals_create' %}?place={{ place.id }}" method="post"> 
        ... 

這裏的相關文件:https://docs.djangoproject.com/en/stable/ref/forms/api/#binding-uploaded-files-to-a-form

+0

我知道這很簡單,但是當事情變得混亂時,我們確實需要額外的眼球。謝謝! –