无法上传带有TypeError的文件:预期的str,字节或os.PathLike对象,而不是列表

gia*_*eat 2 python django django-models django-forms django-views

我有一个user_post.html页面,可让用户上传其文件(gif,mp4)或图像,但是当我单击确认时,我会收到错误提示-

预期的str,字节或os.PathLike对象,而不是列表。

我在主项目文件夹中有一个媒体文件夹,在媒体中,我还有另一个文件夹,称为user_post。

在我的内部 setting.py

MEDIA_URL = 'media'

MEDIA_ROOT = [os.path.join(BASE_DIR,'media')]
Run Code Online (Sandbox Code Playgroud)

我错过了任何东西或语法错误吗?

谢谢!

Traceback:

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\core\handlers\exception.py" in inner
  35.             response = get_response(request)

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\core\handlers\base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\GIAM ZENG KEAT\Desktop\cinemagraph_project\cinemagraph_social_project\post\views.py" in Post
  32.             posted.save()

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\db\models\base.py" in save
  729.                        force_update=force_update, update_fields=update_fields)

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\db\models\base.py" in save_base
  759.             updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\db\models\base.py" in _save_table
  842.             result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\db\models\base.py" in _do_insert
  880.                                using=using, raw=raw)

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\db\models\manager.py" in manager_method
  82.                 return getattr(self.get_queryset(), name)(*args, **kwargs)

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\db\models\query.py" in _insert
  1125.         return query.get_compiler(using=using).execute_sql(return_id)

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\db\models\sql\compiler.py" in execute_sql
  1283.             for sql, params in self.as_sql():

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\db\models\sql\compiler.py" in as_sql
  1236.                 for obj in self.query.objs

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\db\models\sql\compiler.py" in <listcomp>
  1236.                 for obj in self.query.objs

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\db\models\sql\compiler.py" in <listcomp>
  1235.                 [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\db\models\sql\compiler.py" in pre_save_val
  1185.         return field.pre_save(obj, add=True)

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\db\models\fields\files.py" in pre_save
  287.             file.save(file.name, file.file, save=False)

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\db\models\fields\files.py" in save
  87.         self.name = self.storage.save(name, content, max_length=self.field.max_length)

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\core\files\storage.py" in save
  48.         name = self.get_available_name(name, max_length=max_length)

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\core\files\storage.py" in get_available_name
  72.         while self.exists(name) or (max_length and len(name) > max_length):

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\core\files\storage.py" in exists
  308.         return os.path.exists(self.path(name))

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\core\files\storage.py" in path
  321.         return safe_join(self.location, name)

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\utils\functional.py" in __get__
  36.         res = instance.__dict__[self.name] = self.func(instance)

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\site-packages\django\core\files\storage.py" in location
  201.         return os.path.abspath(self.base_location)

File "C:\Users\GIAM ZENG KEAT\Anaconda3\lib\ntpath.py" in abspath
  542.             path = os.fspath(path)

Exception Type: TypeError at /userpost/post/
Exception Value: expected str, bytes or os.PathLike object, not list
Run Code Online (Sandbox Code Playgroud)

models.py

from django.db import models
from django.contrib.auth.models import User
from django.core.validators import FileExtensionValidator
# Create your models here.

class UserPost(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE)
    cinemagraph = models.FileField(upload_to="user_post/", validators=[FileExtensionValidator(allowed_extensions=['gif','png','jpg'])])
    c_description = models.CharField(max_length=500,default='')
    date_time = models.DateTimeField(auto_now=True)

    def __str__(self):
        # Built-in attribute of django.contrib.auth.models.User !
        return self.user.username
Run Code Online (Sandbox Code Playgroud)

views.py

def Post(request):
if request.method == 'POST':
    form_post = UserPostForm(request.POST, request.FILES)

    if form_post.is_valid():
        posted = form_post.save(commit=False)
        posted.user = request.user
        posted.save()
        return reverse('home')
    else:
        return HttpResponse('Posting failed')
else:
    form_post = UserPostForm()
return render(request,'post/user_post.html',{'form_post':form_post})
Run Code Online (Sandbox Code Playgroud)

表格

from django import forms
from django.forms import ModelForm
from post.models import UserPost

class UserPostForm(forms.ModelForm):

    class Meta():
        model = UserPost
        fields= ('cinemagraph','c_description')
Run Code Online (Sandbox Code Playgroud)

user_post.html

{% extends 'base.html'%}
{% load bootstrap3 %}
{% load staticfiles %}

{% block content %}
<div class="container">
  <h1>Post something to our Cinemagraph</h1>
  <form  method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {% bootstrap_form form_post %}
    <input type="submit" class="btn btn-default" value="Confirm">
  </form>
</div>

{% endblock %}
Run Code Online (Sandbox Code Playgroud)

joe*_*odd 7

MEDIA_ROOT应该是字符串而不是列表。

改成

MEDIA_ROOT = os.path.join(BASE_DIR,'media')