Django表单看不到来自fileupload的任何数据

时间:2019-04-15 18:20:59

标签: django file-upload

我在Google搜索了很多东西。我发现我需要将enctype =“ multipart / form-data”添加到表单,但是仍然无法正常工作。无论何时何地,只要我想获取此文件,它都为null。其他一切都按我的规定进行。这是我的代码:

home.html

{% extends 'base_template.html' %}

{% block content %}
   <h1> Welcome to the home jd! </h1>
   <form action = "{% url 'home' %}" method = "post" 
   enctype="multipart/form-data">
   {% csrf_token %}
   {{form}}
   <input type = "submit" value = "add new track">
   </form>
   {{message}}
{% endblock %}

视图:

class home(View):

template_src = "home.html"

def get(self, request):
    form = forms.AddTrack()
    return render(request, self.template_src, {'form': form})

def post(self, request):
    form = forms.AddTrack(request.POST)
    print(request.POST) # Here fileupload field is also blank
    if form.is_valid():
        record = form.save(commit=False)
        record.author = request.user
        record.save()
        form.clean()
        return render(request, self.template_src, {'message': 
        'Added new track!', 'form': form})
    else:
        return render(request, self.template_src, {'message': 
        'Incorrect input!', 'form': form})

型号:

class Track(models.Model):
    title = models.CharField(max_length=40, null=True)
    description = models.CharField(max_length=500, null=True)
    author = models.ForeignKey(User, default=None, 
    on_delete=models.CASCADE)

    audio_or_video = models.FileField(upload_to='audio_and_video/', 
    default="file_not_found", validators=[validate_file_extension])

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

validators.py

def validate_file_extension(value):
   import os
   from django.core.exceptions import ValidationError
   ext = os.path.splitext(value.name)[1]  
   valid_extensions = ['.mp4', '.wav', '.webm', '.mp3']
   print(os.path.splitext(value.name)) #it prints('file_not_found') models.py default value)
if not ext.lower() in valid_extensions:
    raise ValidationError(u'unsupported file extension.')

表格:

class AddTrack(forms.ModelForm):
class Meta:
    model = models.Track
    fields = ['title', 'description', 'audio_or_video']
    widgets = {
        'description': Textarea(attrs={'cols': 30, 'rows': 10}),
    }

    def clean_title(self):
        print("clean title method")

1 个答案:

答案 0 :(得分:2)

很简单,但是我们总是在此行form = forms.AddTrack(request.POST)的post方法中错过它,您还必须添加request.FILES,所以它也必须是form = forms.AddTrack(request.POST, request.FILES)。我想这应该可以解决问题

还在record.save()之后为什么要打电话给form.clean()而不是form.save()