2017-08-17 98 views
0

Hy在那裏,我的第一個問題在這個網站上,所以很抱歉我的英語。所以我嘗試在Django框架中的模型上上傳文件。Django文件上傳使用表格

class banner(models.Model): 
#id is made by Django 
name = models.CharField(max_length=255) 
created_by = models.CharField(max_length=255) 
company = models.CharField(max_length=255) 
register_date = models.DateField(auto_now_add=True) 
file = models.FileField(null=True, blank=True) 
file_name = models.CharField(max_length=255) 

這是模型

class BannerForm(forms.Form): 
name=forms.CharField(max_length=255) 
created_by=forms.CharField(max_length=255) 
company=forms.CharField(max_length=255) 
data_type=forms.CharField(max_length=255) 
register_date=forms.DateField() 
file=forms.FileField() 
file_name=forms.CharField(max_length=255) 

這是形式

DEF add_form(請求): 形式= BannerForm() 最後= models.banner.objects.all() .last()

if request.method == "POST": 
    form = forms.BannerForm(request.POST, request.FILES or None) 
    if form.is_valid(): 
     form.cleaned_data['created_by'] 
     new_banner=models.banner() 
     new_banner.id=last.id+1 
     new_banner.name=form.cleaned_data['name'] 
     new_banner.register_date=form.cleaned_data['register_date'] 
     new_banner.company=form.cleaned_data['company'] 
     new_banner.file=form.cleaned_data['file'] 
     new_banner.file_name=new_banner.file.name 
     new_banner.created_by=form.cleaned_data['created_by'] 
     new_banner.save() 

return render(request, "add_banner.html",{"form":form}) 

這是view.Now每次我嘗試添加一個banner.I瀏覽文件,但我推送後,它是該文件必須選擇,就像它不識別我瀏覽到表單button.Any建議?

+0

我忘了提:它說,提交的文件是空的。 – Unknown

+0

你是否在表單中設置了enctype? –

+0

我只在add_banner.html模板中擁有enctype enctype =「multipart/form-data」 – Unknown

回答

1

以及你需要在你的模型

file = models.FileField(null=True, blank=True,upload_to='files') 

指定上傳路徑,並確保你已經MEDIA_ROOTMEDIA_URL在你的settings.py

定義表單中的

<form method="post" action="" enctype="multipart/form-data"> 
    {% csrf_token %} 
    ... 
</form> 
+0

STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR),「static_cdn」) MEDIA_ROOT = os.path。加入(os.path中。dirname(BASE_DIR),「media_cdn)我有這些和我修改,但仍然沒有什麼相同的東西 – Unknown

+0

嘗試編輯答案,並添加上傳路徑模型後,不要忘記進行遷移和遷移 – Exprator

+0

我試圖上傳一個空文件,我愚蠢的錯誤,但問題,當我嘗試上傳相同的文件到表中,我已經有一行該文件將被覆蓋? – Unknown

1

您需要在表單定義中包含enctype="multipart/form-data"

<form method="post" action="your action" enctype="multipart/form-data"> 
    {% csrf_token %} 
    ... 
</form> 
+0

{%csrf_token%} {{form.as_p}}
Unknown

0

試試這個是這樣的:

Models.py:

class banner(models.Model): 
#id is made by Django 
name = models.CharField(max_length=255) 
created_by = models.CharField(max_length=255) 
company = models.CharField(max_length=255) 
register_date = models.DateField(auto_now_add=True) 
file = models.FileField(upload_to='files/', null=True, blank=True) 
file_name = models.CharField(max_length=255) 

forms.py:

class BannerForm(forms.ModelForm): 
    class Meta: 
     model = banner #Or Banner ?? 
     fields = ('name', 'created_by', 'company', 'file', 'file_name') 

views.py:

from myapp.forms import BannerForm 

if request.method == "POST": 
    form = BannerForm(request.POST, request.FILES) 
    if form.is_valid(): 
     entry = form.save(commit=False) 
     entry.name = request.POST['name'] 
     entry.created_by = request.POST['created_by'] 
     entry.company = request.POST['company'] 
     entry.file_name = request.POST['file_name'] 
     form.save() 

    else: 
     form = BannerForm() 

return render(request, "add_banner.html",locals()) 

而像已經說過了,不要忘了:

<form method="POST" action="" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{form.name}} 
    {{form.created_by}} 
    {{form.company}} 
    {{form.file_name}} 
    {{form.file}} 
    <input type="submit"> 
</form> 

您不必指定這些東西:

new_banner.file=form.cleaned_data['file'] 

new_banner.register_date=form.cleaned_data['register_date'] - >無用的,因爲你的模型設置auto_now_add =真,所以你不需要在你的HTML表單中創建一個字段。

注意:如果你的領域created_by = models.CharField(max_length=255)是把現有的用戶,因此你應該做一個外鍵字段,如:

from django.contrib.auth.models import User 
created_by = models.ForeignKey(User, verbose_name="Created by") 
+0

k,很抱歉由於我缺乏知識而困擾所有人,這是我第一次與Django合作。因此,現在他們將所有上傳內容存儲在項目的主文件中。如果我將file = models.FileField(null = True,blank = True,upload_to ='files')更改爲file = models.FileField(null = True,blank = True,upload_to ='files/Media')文件來源於稱爲媒體的文件夾? – Unknown

+0

你可以試試。如果Django不存在,Django會自動創建一個文件夾。 – GrandGTO

+0

例如,您也可以嘗試:upload_to ='media/banner/whatever /'') – GrandGTO