为什么我的django文件提交没有发布?

时间:2015-10-09 18:23:41

标签: python django forms post upload

我正在忙着建立会议网站应用程序,以便能够上传文章。这些文章也应该能够分配给审阅者以获得下载和评分。我的问题是上传文件。我不确定我做错了什么,但我认为我的表单提交的数据不正确,因为它没有通过'if form.is_valid:'部分。我还是初学者。我看过多个教程。

这是我的model.py文件的样子:

from django.db import models
from time import time

def get_upload_file_name(instance, filename):
    return "uploaded_files/%s_%s" % (str(time()).replace('.','_'), filename)

class Article(models.Model):
    title = models.CharField(max_length=50)
    abstract = models.TextField()
    pub_date = models.DateTimeField('Date published')
    ffile = models.FileField(upload_to=get_upload_file_name)

    def __str__(self):
        return "%s" % (self.title)

这是我的admin.py文件:

from django.contrib import admin
from .models import Article

admin.site.register(Article)

这是我的forms.py文件:

from django import forms
from .models import Article

class ArticleForm(forms.ModelForm):

    class Meta:
        model = Article
        fields = ('title','abstract','pub_date','ffile')

这是我的views.py文件:

from django.shortcuts import render, render_to_response
from django.http import HttpResponseRedirect

from .forms import ArticleForm

def upload_article(request):
    if request.method == 'POST':
        form = ArticleForm(request.POST, request.FILES)
        if form.is_valid():
            instance = ArticleForm(file_field=request.FILES[''])
            form.save()
            instance.save()

            return HttpResponseRedirect('/articles/')

    else: 
        form = ArticleForm()

    return render_to_response('submit/form.html', {'form' : form})

然后是我的HTML模板:

{% extends 'base.html' %}

{% block content %}

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

        {{form.as_p}}
        <input type="submit" value="Submit" />

    </form>


{% endblock %}

我的网址没有问题。有人可以帮助我。或者至少建议一个可以让这更容易的第三方应用程序?

我可以发布不上传文件的普通表单,但我似乎无法得到这个。

1 个答案:

答案 0 :(得分:0)

好的,所以我找到了发布问题的解决方案。

models.py

from django.db import models
from django.forms import ModelForm
from time import time

# Function to determine where to place uploaded documents 
# Taken from youtube tutorial: https://www.youtube.com/watch?v=b43JIn-OGZU&index=15&list=PLxxA5z-8B2xk4szCgFmgonNcCboyNneMD

def get_upload_file_name(instance, filename):
    # return a string: folder_name/time-of-upload + seperated by underscore + filename
    # Example: media_files/15-10-2015_Submission1
    return "uploaded_files/%s_%s" % (str(time()).replace('.','_'), filename)

class Document(models.Model):
    file = models.FileField( blank=False, null=True) 
    title = models.CharField(max_length=200, default=None)

    def __str__(self):
        return "%s" % self.title

class DocumentForm(ModelForm):
    class Meta:
        model = Document
        fields = ['title', 'file']

forms.py

from django import forms
from .models import Document

class UploadFileForm(forms.ModelForm): 
    title = forms.CharField(max_length=200)

    file = forms.FileField(
        label = 'Select a file',
        help_text = 'maximum file size: 50mb',
        allow_empty_file=False
    )

views.py

#@login_required
def upload_file(request):
    # Handle file upload
    if request.POST:
        form = DocumentForm(request.POST, request.FILES)
        #print(request.POST['title'], '   ', request.POST['file'])        
       # print(request.FILES['file'])        
        if form.is_valid():
            #newdoc = Document(title = request.FILES['title'])
            form.save()

            # Redirect to the document list after POST
            # return HttpResponseRedirect(reverse('submissions.views.upload_file'))
            return HttpResponseRedirect('/success/')
    else:
        form = DocumentForm()  #A empty, unbound form

    args = {}
    args.update(csrf(request))
    args['form'] = form
    return render_to_response('submissions/submission.html', args, context_instance=RequestContext(request))

所以其中一个问题是我必须在模型中创建一个FileField,就像在表单中一样。