Форма Django не видит никаких данных из fileupload

#django #file-upload

#django #загрузка файла

Вопрос:

Я много искал в Google. Я обнаружил, что мне нужно добавить 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 %}
  

Вид:

 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:

Просто, но мы всегда пропускаем это в вашем методе post в этой строке form = forms.AddTrack(request.POST) , которую вы request.FILES также должны добавить, так и должно быть form = forms.AddTrack(request.POST, request.FILES) .Я думаю, это должно решить проблему

Также после record.save() того, почему вы звоните form.clean() , не должно ли это быть form.save() вместо этого?

Комментарии:

1. Спасибо за помощь, я проверю, работает ли это и ваш ответ. Я вызывал form.clean, потому что я играл с clean_<имя_поля> в forms.py