2017-06-13 43 views
0

我寫了一個Django應用程序供用戶上傳文件並查看上傳文件的列表。我想限制上傳只使用gif格式,並寫了一個簡單的驗證器。然後我在模型中傳遞驗證器,但它不會觸發,並且無論格式如何,都會保存文件。這是我到目前爲止。Django驗證器沒有觸發文件上傳

views.py

def list(request): 
# Handle file upload 
if request.method == 'POST': 
    form = DocumentForm(request.POST, request.FILES) 
    if form.is_valid(): 
     newdoc = Document(docfile=request.FILES['docfile']) 
     newdoc.save() 
     messages.add_message(request, messages.INFO, "Saved") 

     # Redirect to the document list after POST 
     return HttpResponseRedirect(reverse('list')) 
else: 
    form = DocumentForm() # A empty, unbound form 

# Load documents for the list page 
documents = Document.objects.all() 

# Render list page with the documents and the form 
return render(
    request, 
    'list.html', 
    {'documents': documents, 'form': form} 
) 

checkformat.py

def validate_file_type(upload): 
if not (upload.name[-4:] == '.gif'): 
    raise ValidationError('File type not supported.') 

models.py

from .checkformat import validate_file_type 

def content_file_name(instance, filename): 
    return '/'.join(['documents', str(filename), filename]) 

class Document(models.Model): 
    docfile = models.FileField(upload_to=content_file_name, validators=[validate_file_type], null=False, verbose_name="File") 

forms.py

class DocumentForm(forms.Form): 
docfile = forms.FileField(
    label='Select a file', widget=forms.FileInput(attrs={'accept':'image/gif'}) 
) 

有我丟失的東西?我剛開始學習Django。另外,我知道這不是一種檢查文件類型的安全方式,但我只是想看到它繼續工作。感謝您的時間。

+0

沒有太多的錯誤。嘗試'upload.name.lower.endswith('.gif')'儘管[-4:]確實是一樣的,但較低可能會有所作爲。 – e4c5

+0

請顯示DocumentForm的代碼。 –

+0

@DanielRoseman添加了DocumentForm代碼。 –

回答

0
if form.is_valid(): 
     newdoc = Document(docfile=request.FILES['docfile']) 
     if not '.gif' in newdoc.name: 
      raise ValidationError('File type not supported.') 
     else: 
      newdoc.save() 
      messages.add_message(request, messages.INFO, "Saved") 

試試這個簡單的解決方案,希望它可以作爲你需要

+0

那麼,我更改了代碼並在函數啓動後添加了一個打印,但它並未出現在控制檯中。也許這個電話是錯誤的? 'checkformat.py'與'models.py','views.py'等位於同一層。 –

+0

做了一次在form.save之前的視圖文件中添加了這個驗證,並檢查它是否可以工作 – Exprator

+0

是的,它在那裏工作。扔給我「不支持的文件類型」。錯誤。但是,如果可能的話,我希望它能通過不同文件中的驗證器函數工作。 –

0

看起來目前爲止。也許這只是一個小寫/大寫的問題?

一個更精確的解決方案可能是:

import os 

def validate_file_type(upload): 
    if os.path.splitext(upload.name)[1].lower() != '.gif': 
     raise ValidationError('File type not supported.') 

如果仍然沒有工作嘗試驗證方法中添加一個破發點,並檢查upload.name值。

+0

我在功能啓動後添加了一個打印,但它沒有顯示在我的控制檯上。 –