2015-12-09 106 views
0

我有接收用戶上傳文件的django服務器,然後將元數據存儲在本地以供進一步檢索,但將文件發送到另一個服務器。所以我不希望該文件存儲在本地。這是我最初的模型:如何在django中只保存模型的某些字段

class MainFile(models.Model): 
    owner = models.ForeignKey(User) 
    docfile = models.FileField(verbose_name= 'Enter you file', null=True) 
    file_id = models.TextField(max_length=38, null=True) 

    def __str__(self): 
     return MainFile.file_id 

class MainFileForm(forms.ModelForm): 
    class Meta: 
     model = MainFile 
     fields = ['docfile'] 

我用instance.save(「老闆」,「FILE_ID」),我得到了錯誤:「無法與沒有主鍵強制保存()更新」所以我改變我的模型如下:

class MainFile(models.Model): 
owner = models.ForeignKey(User) 
docfile = models.FileField(verbose_name= 'Enter you file', null=True) 
file_id = models.TextField(max_length=38, primary_key=True, default=1) 

改變我的模型得到的錯誤後:「下面的字段不會在這個模型中存在或M2M領域:FILE_ID」

這是我的觀點:

@login_required 
def StoreSegments(request): 
    if request.method == 'POST': 
     form = MainFileForm(request.POST, request.FILES) 
     if form.is_valid(): 
      file_id = uuid.uuid4() 
      instance = form.save(commit=False) 
      instance.owner = request.user 
      instance.file_id = file_id 
      instance.save(update_fields=['file_id', 'owner']) 
      f = request.FILES['docfile'] 
      urls = 'http://192.168.43.6:8000/StoreSegments' 
      r=requests.post(urls, files= {'segment': f}, data={'segmentID':file_id}) 
      form.save() 
      context = {'form': form, 'message': r.status_code} 
      return render(request, "StoreSegments.html", context) 
    form = MainFileForm() 
    return render(request, 'StoreSegments.html', context={'message': 'request.method =="get" detected', 
              'form': form}) 

那麼,我該如何才能保存元數據並將文件發佈出去呢?

+0

實際修復錯誤不是更好嗎?無論如何,擁有一個「TextField」並不是一個好主意的外鍵,特別是當那個'TextField'的名字表明它更像'IntegerField'時更有意義 – Sayse

+0

您是否已經遷移了您在模型中所做的更改? – masnun

+0

@Sayse我在視圖中用uuid4填充textfield;我將把它改爲UUIDField,看看它是如何工作的。 – Miind

回答

0

你不需要強制主鍵,只需要附加用戶對象。由於您不想將文件保存到本地,因此不需要將其作爲模型的一部分。

你確實希望用戶上傳文件,所以你確實需要它作爲你的表單的一部分。

第一步是從模型中刪除文件字段,並將文件上載字段添加到表格

我還建議添加一些關於您的第三方處理的文件狀態的元信息,但您可以稍後將其添加爲增強功能。

使用你原來的模式,你只需要一個正常的形式有一個字段:

class MainFile(models.Model): 
    owner = models.ForeignKey(User) 
    file_id = models.TextField(max_length=38, null=True) 

    def __str__(self): 
     return MainFile.file_id 

class MainFileForm(forms.Form): 
    docfile = forms.FileField() 

這裏是你應該如何更新視圖:

from django.contrib import messages 

@login_required 
def StoreSegments(request): 
    form = MainFileForm(request.POST or None, request.FILES or None) 
    if form.is_valid(): 
     file_id = uuid.uuid4() 
     MainFile.objects.create(owner=request.owner, file_id=file_id) 
     f = request.FILES['docfile'] 
     urls = 'http://192.168.43.6:8000/StoreSegments' 
     r=requests.post(urls, files= {'segment': f}, data={'segmentID':file_id}) 
     messages.info(request, r.status_code) 
     return redirect("/thank-you") # You should always redirect after POST 
    return render(request, 
        'StoreSegments.html', 
        context={'message': 'request.method =="get" detected', 
          'form': form}) 

你應該在成功總是重定向POST請求(有關詳細信息,請參見this article on wikipedia)。

查看messages framework,在感謝頁面上顯示結果信息。

+0

謝謝,但是instance.save()會在本地保存文件嗎?我不希望發生這種事情,這是我的主要目標。 – Miind

+0

感謝n次,perferctly工作。 – Miind

相關問題