2017-08-12 27 views
0

我有我已經添加了一個ImageField一個基本模型的Django模型的時候。類型錯誤保存包含一個ImageField的

class Category(models.Model): 
    name = models.CharField(max_length=200, unique=True) 
    slug = models.SlugField(blank=True, editable=False) 
    image = models.ImageField(upload_to='images', blank=True) 

    def __str__(self): 
     """ 
      Field to show in the related models admin site. 
     """ 
     return self.name 

    class Meta: 
     # order of drop-down list items 
     ordering = ('name',) 

     # plural form in admin view 
     verbose_name_plural = 'categories' 

    def save(self, *args, **kwargs): 
     """ 
      Save slug when saving model. 
      Slug saved only if not existant, to avoid duplicity of urls. 
     """ 
     if not self.id: 
      # new object to create 
      self.slug = slugify(self.name)[:50] 

     super().save(*args, **kwargs) 

當我試圖創建/由ImageField設置圖像更新從admin區塊中的項目,我得到以下錯誤(這個錯誤並不時ImageField未設置出現):

Internal Server Error: /admin/app/category/8/change/ 
Traceback (most recent call last): 
    File "/usr/lib/python3.6/site-packages/django/core/handlers/exception.py", line 39, in inner 
    response = get_response(request) 
    File "/usr/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "/usr/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/usr/lib/python3.6/site-packages/django/contrib/admin/options.py", line 544, in wrapper 
    return self.admin_site.admin_view(view)(*args, **kwargs) 
    File "/usr/lib/python3.6/site-packages/django/utils/decorators.py", line 149, in _wrapped_view 
    response = view_func(request, *args, **kwargs) 
    File "/usr/lib/python3.6/site-packages/django/views/decorators/cache.py", line 57, in _wrapped_view_func 
    response = view_func(request, *args, **kwargs) 
    File "/usr/lib/python3.6/site-packages/django/contrib/admin/sites.py", line 211, in inner 
    return view(request, *args, **kwargs) 
    File "/usr/lib/python3.6/site-packages/django/contrib/admin/options.py", line 1512, in change_view 
    return self.changeform_view(request, object_id, form_url, extra_context) 
    File "/usr/lib/python3.6/site-packages/django/utils/decorators.py", line 67, in _wrapper 
    return bound_func(*args, **kwargs) 
    File "/usr/lib/python3.6/site-packages/django/utils/decorators.py", line 149, in _wrapped_view 
    response = view_func(request, *args, **kwargs) 
    File "/usr/lib/python3.6/site-packages/django/utils/decorators.py", line 63, in bound_func 
    return func.__get__(self, type(self))(*args2, **kwargs2) 
    File "/usr/lib/python3.6/contextlib.py", line 53, in inner 
    return func(*args, **kwds) 
    File "/usr/lib/python3.6/site-packages/django/contrib/admin/options.py", line 1449, in changeform_view 
    self.save_model(request, new_object, form, not add) 
    File "/usr/lib/python3.6/site-packages/django/contrib/admin/options.py", line 1007, in save_model 
    obj.save() 
    File "/home/hakim/project/app/models.py", line 103, in save 
    super().save(*args, **kwargs) 
    File "/usr/lib/python3.6/site-packages/django/db/models/base.py", line 796, in save 
    force_update=force_update, update_fields=update_fields) 
    File "/usr/lib/python3.6/site-packages/django/db/models/base.py", line 824, in save_base 
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 
    File "/usr/lib/python3.6/site-packages/django/db/models/base.py", line 886, in _save_table 
    for f in non_pks] 
    File "/usr/lib/python3.6/site-packages/django/db/models/base.py", line 886, in <listcomp> 
    for f in non_pks] 
    File "/usr/lib/python3.6/site-packages/django/db/models/fields/files.py", line 292, in pre_save 
    file.save(file.name, file, save=False) 
    File "/usr/lib/python3.6/site-packages/django/db/models/fields/files.py", line 91, in save 
    self.name = self.storage.save(name, content, max_length=self.field.max_length) 
    File "/usr/lib/python3.6/site-packages/django/core/files/storage.py", line 53, in save 
    name = self.get_available_name(name, max_length=max_length) 
    File "/usr/lib/python3.6/site-packages/django/core/files/storage.py", line 77, in get_available_name 
    while self.exists(name) or (max_length and len(name) > max_length): 
    File "/usr/lib/python3.6/site-packages/django/core/files/storage.py", line 394, in exists 
    return os.path.exists(self.path(name)) 
    File "/usr/lib/python3.6/site-packages/django/core/files/storage.py", line 407, in path 
    return safe_join(self.location, name) 
    File "/usr/lib/python3.6/site-packages/django/utils/functional.py", line 35, in __get__ 
    res = instance.__dict__[self.name] = self.func(instance) 
    File "/usr/lib/python3.6/site-packages/django/core/files/storage.py", line 283, in location 
    return abspathu(self.base_location) 
    File "/usr/lib/python3.6/posixpath.py", line 369, in abspath 
    path = os.fspath(path) 
TypeError: expected str, bytes or os.PathLike object, not tuple 

settings.py相關部分:

# Location of uploaded images 

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


# URL of uploaded images 

MEDIA_URL = '/media/' 
+0

如何用'超級變(分類,個體經營).save(* ARGS ,** kwargs)',它工作嗎? –

+0

@SancaKembang不,我仍然得到同樣的錯誤。 – h4k1m

+0

你有兩個或多個同名的對象嗎? –

回答

1

該錯誤指示的問題是一個元組存在,而不是在下面的行的字符串,其中path是上傳文件的位置:

path = os.fspath(path) 

由於upload_to正確設置爲在一個串模型,我想這個問題可能與MEDIA_ROOT有關,後者原來是一個元組(正如評論中所闡明的那樣)。使它成爲一個字符串解決了問題。

0

通過此錯誤:

TypeError: expected str, bytes or os.PathLike object, not tuple 

我認爲錯誤是在形式的像場。在save()中做第一個:

print(self.image) 

要查看您保存的內容,它將是一個元組而不是字符串。

+0

我在模型的'save()'裏添加了一個打印,'self.image'的類型是'' 。當我打印它時,我得到圖像文件的名稱。你的意思是表格中的字段嗎? – h4k1m

+0

嘗試打印路徑self.image.url – wololoooo

0

對我來說,我有這樣的:

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

寫作這種方式解決了這個錯誤:

MEDIA_ROOT=os.path.join(BASE_DIR,'media') 
相關問題