2013-07-21 54 views
8

下面是我項目中django代碼的簡化版本;它允許用戶上傳文件並給它一個標題。此功能完美工作。但是,當用戶稍後重新編輯表單時,將重新顯示文件和標題,但是當用戶去提交文件填充空容器時。重新打開進行編輯形式的文件域看起來是這樣的:用文件區編輯Django模型而不重新上傳文件

目前: media_location/uploadedfile.mp3

變化:文件選擇沒有所選文件

而且我提交後,它是:

  • 提起這需要

[選擇文件]中選擇

我如何得到它使用戶不必重新上傳文件沒有文件?提交完成後字段是否爲只讀,或者是否可編輯,對我而言無關緊要。已完成的項目不適合客戶,只能由一小部分值得信賴的用戶使用,但如果可能的話,我仍然希望遵循最佳做法。謝謝你的幫助。

的Django代碼:

models.py

class Recording(models.Model): 
    rec_title=models.CharField(max_length=200,blank=True) 
    rec_file = models.FileField(upload_to='recordings') 

forms.py

from django import forms 
from songstorage.models import Recording 
class RecordingForm(forms.ModelForm): 
    rec_file=forms.FileField(label='Upload File') 
    rec_title=forms.CharField(label='Recording Title',required=False)  
    class Meta: 
     model=Recording 

views.py

def addrecordings(request,recordingfile): 
    #if there is a recordingfile in the url, the user is editing... 
    if recordingfile: 
     recording=Recording.objects.get(rec_title=recordingfile) 
     recording_form = RecordingForm(instance=recording) 
    #...Otherwise a new form is createing a new one 
    else: 
     recording_form = RecordingForm(request.POST, request.FILES) 

    #When the form is submitted, do the following: 
    if request.method == 'POST': 
     #check if its valid 
     if recording_form.is_valid(): 
      recording_form.save() 
      #if sucessfully submitted, redirect 
      return redirect('/recordings/') 
    return render_to_response('addrecordings.html',{'recording_form':recording_form},context_instance=RequestContext(request)) 
+1

有類似的問題,只是好奇,如果你已經完成了嗎? –

+1

我認爲Django應該添加一項功能來解決這個問題。 –

回答

0

我有同樣的問題,無法弄清楚如何,也能搜索有用的東西,我目前的解決方案是使用另一種形式,在您的方案:

class RecordingUpdateForm(RecordingForm): 
    rec_file=forms.FileField(label='Upload File', required=False) 

唯一不同的是我使用基於UpdateView類的視圖,因此您必須修改視圖函數以使用RecordingUpdateForm進行更新。

0

我有同樣的問題。

您可以覆蓋模型的默認清理函數。這將驗證所有表單,用戶可以在編輯時更改圖像文件,並且文件保證不爲空。

class MyModel(models.Model): 
    image = models.ImageField(blank=True) 
    def clean(self, *args, **kwargs): 
    super(MyModel, self).clean(*args, **kwargs) 
    if not self.image: 
     raise ValidationError('Please provide an image')