2017-10-14 61 views
-1

這裏是我的代碼兩種形式一種觀點認爲:模型變量失去價值

@login_required 
def upload(request): 
    form_type = '' 
    transcript = Transcript() 
    transcript.file_path = '' 
    if request.method == 'POST': 
     if 'file_form' in request.POST: 
      file_form = FileForm(request.POST, request.FILES) 
      if file_form.is_valid(): 
       path = handle_uploaded_file(request.FILES['file'], request.user) 
       transcript.file_path = path 
       transcript.user = request.user 
       export_form = InfoForm() 
       form_type = 'info_form' 
     elif 'info_form' in request.POST: 
      if transcript.file_path: 
       info_form = InfoForm(request.POST) 
       if info_form.is_valid(): 
        transcript.user = request.user 
        transcript.title = info_form.cleaned_data.get('title') 
        transcript.instructions = info_form.cleaned_data.get('instructions') 
        transcript.save() 
        return HttpResponseRedirect('thanks') 
      else: 
       raise ValueError('Transcript object has no file path attribute') 
    else: 
     export_form = FileForm() 
     form_type = 'file_form' 

    return render(request, 'transcription/upload.html', {'form': export_form, 'form_type': form_type}) 

始終,文件形式的信息形式之前調用,所以if語句

if transcript.file_path: 
    #... 

代碼應該始終執行。但ValueError總是被提升,意味着transcript.file_path被重置。這是怎麼發生的?如何解決?

POST中的file_form和info_form是不同提交按鈕的名稱,所以我知道我正在處理哪個表單。

def handle_uploaded_file(file, user): 
    id = randint(0, 10000) 
    user_dir = settings.MEDIA_ROOT + '/' + str(user.id).replace(".", "") + '/' 
    path = user_dir + file.name.replace(".mp3", str(id) + ".mp3") 
    if not os.path.exists(user_dir): 
     os.makedirs(user_dir) 
    with open(path, 'wb+') as destination: 
     for chunk in file.chunks(): 
      destination.write(chunk) 
     file = File(destination) 
     info = {'path': path, 'file': file} 
    return path 
+1

在你的方法的第三行中,你正在執行'transcript.file_path ='''...這樣,如果塊永遠不會執行。 – solarissmoke

+0

它執行,因爲if語句不測試file_path。問題在於第二個區塊。它執行,但引發價值錯誤@solarissmoke –

+0

我不知道你的意思。你的if語句**對'file_path'進行**測試。發生的事情很簡單。在第三行中,你設置了'transcript.file_path ='''。在第14行中,你檢查'transcript.file_path'是否會因爲你將其設置爲''''而始終爲假。因此'else'模塊執行,你得到'ValueError'。 – solarissmoke

回答

0

所以這是一個菜鳥的錯誤。 我不知道在每個帖子請求期間整個視圖會被再次調用。 所以我剛剛初始化我的變量

form_type = '' 
transcript = Transcript() 
transcript.file_path = '' 

以外的視圖和瞧!

+0

對於它的價值來說,這不是一個好主意,並且會導致您前進中出現各種問題,特別是在生產環境中使用多線程環境時。你在這裏沒有線程安全,並會出現意想不到的和非常混亂的行爲。如果你需要保存變量,然後將它們作爲參數傳遞給你的函數。 – solarissmoke