Django从表单上传文件无法验证

时间:2017-05-29 05:44:37

标签: python django

我正在尝试为我的个人网站建立一个媒体库。我可以通过FileField在django管理员中上传文件,但我希望能够在我的媒体库页面中进行。当我尝试验证从媒体库页面获取的表单时,form.is_valid()失败并返回Not Found:/ media /

我的MEDIA_URL是媒体/

# views.py
class MediaView(UpdateView):
    form_class = FileForm
    model = File
    template_name = 'myapp/media.html'

    def get(self, request):
        if (request.user.is_superuser):

            form = self.form_class(None)
            files = File.objects.all()

            return render(request, self.template_name, {'form': form, 'files': files})
        else:
            return HttpResponseForbidden()

    def post(self, request):

        if (not request.user.is_superuser):
            return HttpResponseForbidden()

        form = self.form_class(request.POST)

        if (form.is_valid()):
            name = form.cleaned_data['name']
            file = form.cleaned_data['file']

            media = form.save(commit=False)

            if (not name):
               media.name = name
            media.file = file

            media = form.save()

            return redirect('/media')
        else:
            return HttpResponseNotFound()

    # models.py
    class File(models.Model):
        name = models.CharField(max_length=256, null=True, blank=True)
        file = models.FileField()
        date_uploaded = models.DateTimeField(default=datetime.now)

        def __str__(self):
        if (not self.name):
            return str(self.file)
        else:
            return self.name

    # (template) media.py
    <div class="flex-container">
<div class="flex-column content">
    <h1>Media</h1>
    <form class="upload-form" role="form" method="post">
        {% csrf_token %}
        {{ form }}
        <span class="upload-file-cover">Choose File:</span>
        <button class="button" type="submit">Upload</button>
    </form>
    <ul class="media-uploads">
        {% for file in files %}
            <li>
                <p class="clipboard-text">/{{ file.file.url }}</p>
                <a class="copy-to-clipboard">
                    {{ file|filetypeicon }}
                    <div class="tooltip">Copy to clipboard</div>
                </a>
                <a href="/{{ file.file.url }}" target="_blank">{{ file }}</a>
                <a href="/delete/media/{{ file.id }}" class="delete">Delete</a>
            </li>
        {% empty %}
            Nothing here.
        {% endfor %}
    </ul>
</div>
{% include "personal/includes/sidebar-latest.html" %}
{% include "personal/includes/sidebar-profile.html" %}

# forms.py
from personal.models import File
from django import forms

class FileForm(forms.ModelForm):
    class Meta:
        model = File
        fields = ['name', 'file']

1 个答案:

答案 0 :(得分:1)

处理用户上传的文件时Django期望另一个名为request.FILES的参数以及request.POST。

POST方法

form = self.form_class(request.POST, request.FILES)