2015-05-25 54 views
0

我一直在使用django創建一個資產管理應用程序,並且在文件上傳中打了一堵牆以模擬實例行爲。我試圖使用Forms.py中的ModelForm類django form.save()無法在模型實例上寫入磁盤更新

基本上我非常確定form.save()不會將我上傳的文件寫入磁盤來更新我的模型實例。 我是否必須在我的AssetForm中編寫form.save定義?或者我錯過了別的東西。

感謝任何幫助。

我的項目是圍繞投票教程https://docs.djangoproject.com/en/1.8/intro/tutorial01/和最小文件上傳教程Need a minimal Django file upload example

這裏是我的模型的.py

class Category(models.Model): 
    category_text = models.CharField(max_length=200) 
    def __str__(self):    # __unicode__ on Python 2 
     return self.category_text 

class Asset(models.Model): 
    asset_text = models.CharField(max_length=200) 
    asset_tag = models.CharField(max_length=200) 
    asset_category = models.ForeignKey(Category) 
    cert_date = models.DateTimeField('cert published') 

    def __str__(self):    # __unicode__ on Python 2 
     return self.asset_text 
    def was_certed_recently(self): 
     return self.cert_date >= timezone.now() - datetime.timedelta(days=365) 
    was_certed_recently.admin_order_field = 'cert_date' 
    was_certed_recently.boolean = True 
    was_certed_recently.short_description = 'Certified recently?' 
    docfile = models.FileField(upload_to='documents') 

這裏是我的forms.py

from django import forms 
from django.forms import ModelForm 
from polls.models import Asset 





class AssetForm(ModelForm): 
    class Meta: 
     model = Asset 
     fields = '__all__' 

這裏是我的views.py

# -*- coding: utf-8 -*- 
from django.shortcuts import render_to_response 
from django.template import RequestContext 
from django.http import HttpResponseRedirect 
from django.core.urlresolvers import reverse 
from django.http import HttpResponse 
#from django.template import RequestContext, loader 
from django.shortcuts import get_object_or_404, render 
from django.http import Http404 
from polls.models import Asset 
from polls.forms import AssetForm 

def list(request, asset_id): 
    # Handle file upload 
    ID = asset_id 
    p = get_object_or_404(Asset, pk = asset_id) 

    if request.method == 'POST': 
     form = AssetForm(request.POST, request.FILES, instance= p) 
     if form.is_valid(): 
      form.save() 
      # Redirect to the document list after POST 
      return HttpResponseRedirect(reverse('list', args=(p.id,))) 

    else: 
     form = AssetForm() # A empty, unbound form 

    # Load documents for the list page 
    documents = p 



    # Render list page with the documents and the form 
    return render_to_response(
     'polls/list.html', 
     {'documents': documents, 'ID': ID, 'form': form}, 
     context_instance=RequestContext(request) 
    ) 



def index(request): 
    latest_asset_list = Asset.objects.order_by('-cert_date')[:] 
    context = {'latest_asset_list': latest_asset_list} 
    return render(request, 'polls/index.html', context) 

url.py

from django.conf.urls import url 
from . import views 


urlpatterns = [ 
    #url(r'^/list/$', 'list', name='list'), 
    url(r'^$', views.index, name='index'), 
    # ex: /polls/5/ 
    url(r'^(?P<asset_id>[0-9]+)/$', views.list, name='list'), 
    # ex: /polls/5/results/ 
    url(r'^(?P<asset_id>[0-9]+)/results/$', views.results, name='results'), 
    # ex: /polls/5/vote/ 
    url(r'^(?P<asset_id>[0-9]+)/vote/$', views.vote, name='vote'), 

]  

最後我list.html模板

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8"> 
     <title>Minimal Django File Upload Example</title> 
    </head> 
    <body> 
    <!-- List of uploaded documents --> 
    {% if documents %} 
     <ul> 
      <p>Current Doc.</p> 
      <li><a href="{{ documents.docfile.url }}">{{ documents.docfile.name }}</a></li> 

     </ul> 
    {% else %} 
     <p>No documents.</p> 
    {% endif %} 

    <ul> 



{{ ID }} 



     <!-- Upload form. Note enctype attribute! --> 
     <form action="{% url 'list' ID %}" method="post" enctype="multipart/form-data"> 


      {% csrf_token %} 
      <p>{{ form.non_field_errors }}</p> 
      <p>{{ form.docfile.label_tag }} {{ form.docfile.help_text }}</p> 
      <p> 
       {{ form.docfile.errors }} 
       {{ form.docfile }} 
      </p> 
      <p><input type="submit" value="Upload" /></p> 
     </form> 
    </body> 
</html> 
+0

對這一個更多的幫助將不勝感激。 – user276537

回答

0

你正在做兩次不同的事情。例如,在您的功能開始時,您將資產轉換爲p,然後您將同一個轉換爲a。爲什麼?

更重要的是,在is_valid()區塊中,您只需從上傳的文件中創建一個新的Asset對象,而表格中沒有其他數據,但是您保存了應更新現有資產的表單本身。這可能是你的問題的原因 - 你應該刪除docfile行並保存表格。

+0

感謝您的幫助Daniel.I刪除了上述views.py代碼中的冗餘分配,並按照您的建議從if.form_is_valid()塊中刪除了docfile行。然而,form.save()命令仍然無法將新文件分配寫入磁盤。 – user276537