2016-07-23 59 views
0

我有一個表單域這樣我怎樣才能提高驗證錯誤了的FileField

class FeedForm(ModelForm): 
    files=form.FileField(validators=[validate_file_extension]) 
    class Meta: 
     model=Feed 
     fields=('text','auth','files',) 

與使用,以允許特定文件類型的驗證: validator.py

def validate_file_extension(value): 
    ext = os.path.splitext(value.name)[1] # [0] returns path+filename 
    valid_extensions = ['.pdf', '.doc', '.docx', '.jpg', '.png', '.xlsx', '.xls'] 
    if not ext.lower() in valid_extensions: 
     raise ValidationError(u'Unsupported file extension.') 

我想在我的模板中提出上面的驗證錯誤,我該如何解決它?

views.py生成形式:

def post_feed(request): 
form_class = FeedForm 
if request.method == 'POST': 
    form = form_class(request.POST,request.FILES) 
    if form.is_valid(): 
     feed = form.save(commit=False) 
     feed.user = User.objects.get(pk=7) 
     feed.pub_date=timezone.now() 
     #instance = Feed(files=request.FILES['files']) 
     # feed.files=request.FILES['files'] 
     feed.save() 
     return redirect('home') 

else: 
    form = form_class() 
concern='Concern' 
feeds=Feed.objects.filter(pub_date__lte=timezone.now()).order_by('-pub_date') 
paginator = Paginator(feeds,5) # Show 25 contacts per page 
page = request.GET.get('page') 
try: 
    feedz = paginator.page(page) 
except PageNotAnInteger: 
    feedz = paginator.page(1) 
except EmptyPage: 
    feedz = paginator.page(paginator.num_pages) 

#return redirect('home') 
return render_to_response('index.html', {"feeds":feeds,"feedz": feedz,'form':FeedForm(),'feed_detail':feed_detail,}) 

意見認爲形式是關於使用include標籤:

def home(request): 
    concern='Concern' 
    feeds=Feed.objects.filter(pub_date__lte=timezone.now()).order_by('-pub_date') 
    paginator = Paginator(feeds,5) # Show 25 contacts per page 
    page = request.GET.get('page') 
    try: 
     feedz = paginator.page(page) 
    except PageNotAnInteger: 
     # If page is not an integer, deliver first page. 
     feedz = paginator.page(1) 
    except EmptyPage: 
     # If page is out of range (e.g. 9999), deliver last page of results. 
     feedz = paginator.page(paginator.num_pages) 
    return render_to_response('index.html', {"feeds":feeds,"feedz": feedz,'form':FeedForm(),'feed_detail':feed_detail,},context_instance=RequestContext(request)) 

HTML生成該形式:post_feed.html

<form role="form" action="{% url 'post_feed' %}" enctype="multipart/form-data" method="post"> 
    {% csrf_token %} 
    <div class="mdl-textfield mdl-js-textfield "> 
    {{form.text}} 
    <label class="mdl-textfield__label" for="{{form.text.id_for_label}}">Cheated on?Blow the whistle here</label> 
    </div> 
    <div class="mdl-select mdl-js-select mdl-select--floating-label"> 
    <label class="mdl-select__label" for="{{form.auth.id_for_label}}">Authority addressed to:<br/></label> 
    {{form.auth}} 

    </div><br/> 


     {{form.files}} 



    <br/> {{form.files2}} 
    <br/> {{form.files3}} 

    <br/><br/> <button class="mdl-button mdl-js-button mdl-js-ripple-effect mdl-button--raised mdl-button--colored">Post</button> 
    {% if form.errors %} 
    {% for field in form %} 
    {% for error in field.errors %} 
    <div class="alert alert-error"> 
    <strong>{{error|escape}}</strong> 
    </div> 
    {% endfor %} 
    {% endfor %} 
    {% endif %} 

    </form> 

使用include標記具有上述形式的html

{% include "post_feed.html" %} 
    <h2>Feed Stream</h2> 

    {% for feed in feedz %} 
     <strong> {{feed.full_name_of_poster|title}} </strong> | 
      {% if feed.resolved == True %} 
      RESOLVED 
      {% else %} 
      UNRESOLVED 
      {% endif %} 
      <p> To:<a href="{% url 'authority_details' pk=feed.auth.pk slug=feed.auth.slug %}">{{feed.auth}} </a></p> 

      <p>{{feed.text}} </p> 
      <a href="{% url 'feed_detail' slug=feed.slug %}">Full details</a> 
      <p id='count'> {{feed.total_concerns}} concern{{feed.total_concerns|pluralize:'s'}} &nbsp {{feed.no_of_comments}} comment{{feed.no_of_comments|pluralize:'s'}} </p> 
      <p> {{feed.pub_date|naturaltime|capfirst}} </p> 

      <hr/> 
      {% endfor %} 
<div class="pagination"> 
    <span class="step-links"> 
     {% if feedz.has_previous %} 
      <a href="?page={{ feedz.previous_page_number }}">previous</a> 
     {% endif %} 
<span class="current"> 
      Page {{ feedz.number }} of {{ feedz.paginator.num_pages }}. 
     </span> 
     {% if feedz.has_next %} 
      <a href="?page={{ feedz.next_page_number }}">next</a> 
     {% endif %} 
    </span> 
</div> 
{% endblock %} 

我已經通過文檔,但沒有突破沒有了,請幫我out.Thanks提前

回答

0

一個函數基於認爲處理形式通常的格式爲:

def post_feed(request): 
    form_class = FeedForm 
    if request.method == 'POST': 
     form = form_class(request.POST,request.FILES) 
     if form.is_valid(): 
      # process the form then redirect 
      ... 
      return redirect('home') 
     else: 
      # You don't actually need this else statement here 
      print form.errors 
    else: 
     # create blank form for GET requests 
     form = form_class() 
    # Now return a response for GET requests and invalid POST requests 
    concern='Concern' 
    feeds=Feed.objects.filter(pub_date__lte=timezone.now()).order_by('-pub_date') 
    return render(request , 'index.html' ,{'feeds':feeds,'form':FeedForm(),'feed_detail':feed_detail,}) 

所以你只需要在視圖末尾改變縮進,這樣你也可以返回無效POST請求的響應。

如果您在模板中使用{{ form }},Django將自動顯示任何驗證錯誤。如果您單獨呈現字段,請參閱手動呈現字段的文檔以瞭解如何手動包含錯誤。

+0

謝謝你的建議。我已經實現了它,但還沒有工作。但我遇到的問題是我使用'include'將view.post_feed生成的窗體放在另一個view.home中。複雜的。目前,當我把一個無效的文件。它只是加載整個頁面再次沒有提出任何錯誤。我會更新我的問題,希望你能幫助 –

+0

當你返回響應時,你的更新代碼創建一個新的窗體:''形式':FeedForm()'。這是一個空白表格,所以沒有任何錯誤。您應該傳遞您之前在視圖中創建的表單。另外,不要使用'render_to_response',它已經過時了。使用'render'代替。 – Alasdair

+0

它完美的工作。現在我理解渲染參數的本質。非常感謝 –