Я много искал в гугле.Я обнаружил, что мне нужно добавить enctype = "multipart / form-data" для формы, но это все еще не работает.Везде, где бы я ни хотел получить этот файл, он просто нулевой.Все остальное работает как я исключаю.Вот мой код:
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 %}
view:
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")