使用 Django Admin 上传图像时出现 TemplateSyntaxError

发布于 2024-11-03 16:35:06 字数 10408 浏览 2 评论 0原文

我尝试了 "使用 Django Admin 上传图像?" 中的示例,但不幸的是我失败了一直。

模型是:

from django.db import models
from django.contrib import admin

class Celebrity(models.Model):
    name = models.CharField(max_length=200)

    def __unicode__(self):
        return self.name


class Image(models.Model):
    celebrity = models.ForeignKey(Celebrity)
    image = models.ImageField('Bild', upload_to="files/")

    def __unicode__(self):
       return self.image

class InlineImage(admin.TabularInline):
    model = Image

class CelebrityAdmin(admin.ModelAdmin):
    inlines = [InlineImage]

admin.site.register(Celebrity, CelebrityAdmin)

MEDIA_ROOT 是:

MEDIA_ROOT =  'c:/python/django/apps/af/neu/images/media/'

这是网址:

url(r'^media/(?P<path>.*)$', 'django.views.static.serve',
{ 'document_root': 'c:/python/django/apps/af/neu/images/media/files' }),

# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),

使用此配置,上传可以正常工作,但是当我尝试编辑然后我得到以下回溯:

Environment:


Request Method: GET
Request URL: http://localhost:8000/admin/image/celebrity/3/

Django Version: 1.3
Python Version: 2.6.6
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'debug_toolbar',
 'images.image']
Installed Middleware:
('debug_toolbar.middleware.DebugToolbarMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Template error:
In template c:\python\lib\site-packages\django\contrib\admin\templates\admin\edit_inline\tabular.html, error at line 27
   Caught TypeError while rendering: coercing to Unicode: need string or buffer, ImageFieldFile found
   17 : 


   18 :      <tbody>


   19 :      {% for inline_admin_form in inline_admin_formset %}


   20 :         {% if inline_admin_form.form.non_field_errors %}


   21 :         <tr><td colspan="{{ inline_admin_form|cell_count }}">{{ inline_admin_form.form.non_field_errors }}</td></tr>


   22 :         {% endif %}


   23 :         <tr class="{% cycle "row1" "row2" %} {% if inline_admin_form.original or inline_admin_form.show_url %}has_original{% endif %}{% if forloop.last %} empty-form{% endif %}"


   24 :              id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">


   25 :         <td class="original">


   26 :           {% if inline_admin_form.original or inline_admin_form.show_url %}<p>


   27 :           {% if inline_admin_form.original %}  {{ inline_admin_form.original }} {% endif %}


   28 :           {% if inline_admin_form.show_url %}<a href="../../../r/{{ inline_admin_form.original_content_type_id }}/{{ inline_admin_form.original.id }}/">{% trans "View on site" %}</a>{% endif %}


   29 :             </p>{% endif %}


   30 :           {% if inline_admin_form.has_auto_field %}{{ inline_admin_form.pk_field.field }}{% endif %}


   31 :           {{ inline_admin_form.fk_field.field }}


   32 :           {% spaceless %}


   33 :           {% for fieldset in inline_admin_form %}


   34 :             {% for line in fieldset %}


   35 :               {% for field in line %}


   36 :                 {% if field.is_hidden %} {{ field.field }} {% endif %}


   37 :               {% endfor %}


Traceback:
File "C:\Python\lib\site-packages\django\core\handlers\base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "C:\Python\lib\site-packages\django\contrib\admin\options.py" in wrapper
  307.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "C:\Python\lib\site-packages\django\utils\decorators.py" in _wrapped_view
  93.                     response = view_func(request, *args, **kwargs)
File "C:\Python\lib\site-packages\django\views\decorators\cache.py" in _wrapped_view_func
  79.         response = view_func(request, *args, **kwargs)
File "C:\Python\lib\site-packages\django\contrib\admin\sites.py" in inner
  197.             return view(request, *args, **kwargs)
File "C:\Python\lib\site-packages\django\utils\decorators.py" in _wrapper
  28.             return bound_func(*args, **kwargs)
File "C:\Python\lib\site-packages\django\utils\decorators.py" in _wrapped_view
  93.                     response = view_func(request, *args, **kwargs)
File "C:\Python\lib\site-packages\django\utils\decorators.py" in bound_func
  24.                 return func(self, *args2, **kwargs2)
File "C:\Python\lib\site-packages\django\db\transaction.py" in inner
  217.                 res = func(*args, **kwargs)
File "C:\Python\lib\site-packages\django\contrib\admin\options.py" in change_view
  1030.         return self.render_change_form(request, context, change=True, obj=obj)
File "C:\Python\lib\site-packages\django\contrib\admin\options.py" in render_change_form
  708.         ], context, context_instance=context_instance)
File "C:\Python\lib\site-packages\django\shortcuts\__init__.py" in render_to_response
  20.     return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "C:\Python\lib\site-packages\django\template\loader.py" in render_to_string
  188.         return t.render(context_instance)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  123.             return self._render(context)
File "C:\Python\lib\site-packages\django\test\utils.py" in instrumented_test_render
  57.     return self.nodelist.render(context)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "C:\Python\lib\site-packages\django\template\debug.py" in render_node
  73.             result = node.render(context)
File "C:\Python\lib\site-packages\django\template\loader_tags.py" in render
  127.         return compiled_parent._render(context)
File "C:\Python\lib\site-packages\django\test\utils.py" in instrumented_test_render
  57.     return self.nodelist.render(context)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "C:\Python\lib\site-packages\django\template\debug.py" in render_node
  73.             result = node.render(context)
File "C:\Python\lib\site-packages\django\template\loader_tags.py" in render
  127.         return compiled_parent._render(context)
File "C:\Python\lib\site-packages\django\test\utils.py" in instrumented_test_render
  57.     return self.nodelist.render(context)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "C:\Python\lib\site-packages\django\template\debug.py" in render_node
  73.             result = node.render(context)
File "C:\Python\lib\site-packages\django\template\loader_tags.py" in render
  64.             result = block.nodelist.render(context)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "C:\Python\lib\site-packages\django\template\debug.py" in render_node
  73.             result = node.render(context)
File "C:\Python\lib\site-packages\django\template\defaulttags.py" in render
  227.                 nodelist.append(node.render(context))
File "C:\Python\lib\site-packages\django\template\loader_tags.py" in render
  170.             return self.render_template(template, context)
File "C:\Python\lib\site-packages\django\template\loader_tags.py" in render_template
  141.         output = template.render(context)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  123.             return self._render(context)
File "C:\Python\lib\site-packages\django\test\utils.py" in instrumented_test_render
  57.     return self.nodelist.render(context)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "C:\Python\lib\site-packages\django\template\debug.py" in render_node
  73.             result = node.render(context)
File "C:\Python\lib\site-packages\django\template\defaulttags.py" in render
  227.                 nodelist.append(node.render(context))
File "C:\Python\lib\site-packages\django\template\defaulttags.py" in render
  311.             return self.nodelist_true.render(context)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "C:\Python\lib\site-packages\django\template\debug.py" in render_node
  73.             result = node.render(context)
File "C:\Python\lib\site-packages\django\template\defaulttags.py" in render
  311.             return self.nodelist_true.render(context)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "C:\Python\lib\site-packages\django\template\debug.py" in render_node
  73.             result = node.render(context)
File "C:\Python\lib\site-packages\django\template\debug.py" in render
  92.             output = force_unicode(output)
File "C:\Python\lib\site-packages\django\utils\encoding.py" in force_unicode
  71.                 s = unicode(s)

Exception Type: TemplateSyntaxError at /admin/image/celebrity/3/
Exception Value: Caught TypeError while rendering: coercing to Unicode: need string or buffer, ImageFieldFile found

我也尝试了 MEDIA_ROOT,例如:

MEDIA_ROOT = os.path.join(os.path.dirname(file), "media").replace(r"\\", "//"),

MEDIA_ROOT = os.path.join(os.path.dirname(file), "media").replace("\\", "//"),

但甚至上传都不起作用

所以我我真的一无所知。非常感谢任何帮助

I tried the example from "Uploading images using Django Admin?" but unfortunately I am failing all the time.

The model is:

from django.db import models
from django.contrib import admin

class Celebrity(models.Model):
    name = models.CharField(max_length=200)

    def __unicode__(self):
        return self.name


class Image(models.Model):
    celebrity = models.ForeignKey(Celebrity)
    image = models.ImageField('Bild', upload_to="files/")

    def __unicode__(self):
       return self.image

class InlineImage(admin.TabularInline):
    model = Image

class CelebrityAdmin(admin.ModelAdmin):
    inlines = [InlineImage]

admin.site.register(Celebrity, CelebrityAdmin)

The MEDIA_ROOT is:

MEDIA_ROOT =  'c:/python/django/apps/af/neu/images/media/'

This is the url:

url(r'^media/(?P<path>.*)

With this configuration the upload works, but when I am trying to edit then I get the following traceback:

Environment:


Request Method: GET
Request URL: http://localhost:8000/admin/image/celebrity/3/

Django Version: 1.3
Python Version: 2.6.6
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'debug_toolbar',
 'images.image']
Installed Middleware:
('debug_toolbar.middleware.DebugToolbarMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Template error:
In template c:\python\lib\site-packages\django\contrib\admin\templates\admin\edit_inline\tabular.html, error at line 27
   Caught TypeError while rendering: coercing to Unicode: need string or buffer, ImageFieldFile found
   17 : 


   18 :      <tbody>


   19 :      {% for inline_admin_form in inline_admin_formset %}


   20 :         {% if inline_admin_form.form.non_field_errors %}


   21 :         <tr><td colspan="{{ inline_admin_form|cell_count }}">{{ inline_admin_form.form.non_field_errors }}</td></tr>


   22 :         {% endif %}


   23 :         <tr class="{% cycle "row1" "row2" %} {% if inline_admin_form.original or inline_admin_form.show_url %}has_original{% endif %}{% if forloop.last %} empty-form{% endif %}"


   24 :              id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">


   25 :         <td class="original">


   26 :           {% if inline_admin_form.original or inline_admin_form.show_url %}<p>


   27 :           {% if inline_admin_form.original %}  {{ inline_admin_form.original }} {% endif %}


   28 :           {% if inline_admin_form.show_url %}<a href="../../../r/{{ inline_admin_form.original_content_type_id }}/{{ inline_admin_form.original.id }}/">{% trans "View on site" %}</a>{% endif %}


   29 :             </p>{% endif %}


   30 :           {% if inline_admin_form.has_auto_field %}{{ inline_admin_form.pk_field.field }}{% endif %}


   31 :           {{ inline_admin_form.fk_field.field }}


   32 :           {% spaceless %}


   33 :           {% for fieldset in inline_admin_form %}


   34 :             {% for line in fieldset %}


   35 :               {% for field in line %}


   36 :                 {% if field.is_hidden %} {{ field.field }} {% endif %}


   37 :               {% endfor %}


Traceback:
File "C:\Python\lib\site-packages\django\core\handlers\base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "C:\Python\lib\site-packages\django\contrib\admin\options.py" in wrapper
  307.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "C:\Python\lib\site-packages\django\utils\decorators.py" in _wrapped_view
  93.                     response = view_func(request, *args, **kwargs)
File "C:\Python\lib\site-packages\django\views\decorators\cache.py" in _wrapped_view_func
  79.         response = view_func(request, *args, **kwargs)
File "C:\Python\lib\site-packages\django\contrib\admin\sites.py" in inner
  197.             return view(request, *args, **kwargs)
File "C:\Python\lib\site-packages\django\utils\decorators.py" in _wrapper
  28.             return bound_func(*args, **kwargs)
File "C:\Python\lib\site-packages\django\utils\decorators.py" in _wrapped_view
  93.                     response = view_func(request, *args, **kwargs)
File "C:\Python\lib\site-packages\django\utils\decorators.py" in bound_func
  24.                 return func(self, *args2, **kwargs2)
File "C:\Python\lib\site-packages\django\db\transaction.py" in inner
  217.                 res = func(*args, **kwargs)
File "C:\Python\lib\site-packages\django\contrib\admin\options.py" in change_view
  1030.         return self.render_change_form(request, context, change=True, obj=obj)
File "C:\Python\lib\site-packages\django\contrib\admin\options.py" in render_change_form
  708.         ], context, context_instance=context_instance)
File "C:\Python\lib\site-packages\django\shortcuts\__init__.py" in render_to_response
  20.     return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "C:\Python\lib\site-packages\django\template\loader.py" in render_to_string
  188.         return t.render(context_instance)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  123.             return self._render(context)
File "C:\Python\lib\site-packages\django\test\utils.py" in instrumented_test_render
  57.     return self.nodelist.render(context)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "C:\Python\lib\site-packages\django\template\debug.py" in render_node
  73.             result = node.render(context)
File "C:\Python\lib\site-packages\django\template\loader_tags.py" in render
  127.         return compiled_parent._render(context)
File "C:\Python\lib\site-packages\django\test\utils.py" in instrumented_test_render
  57.     return self.nodelist.render(context)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "C:\Python\lib\site-packages\django\template\debug.py" in render_node
  73.             result = node.render(context)
File "C:\Python\lib\site-packages\django\template\loader_tags.py" in render
  127.         return compiled_parent._render(context)
File "C:\Python\lib\site-packages\django\test\utils.py" in instrumented_test_render
  57.     return self.nodelist.render(context)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "C:\Python\lib\site-packages\django\template\debug.py" in render_node
  73.             result = node.render(context)
File "C:\Python\lib\site-packages\django\template\loader_tags.py" in render
  64.             result = block.nodelist.render(context)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "C:\Python\lib\site-packages\django\template\debug.py" in render_node
  73.             result = node.render(context)
File "C:\Python\lib\site-packages\django\template\defaulttags.py" in render
  227.                 nodelist.append(node.render(context))
File "C:\Python\lib\site-packages\django\template\loader_tags.py" in render
  170.             return self.render_template(template, context)
File "C:\Python\lib\site-packages\django\template\loader_tags.py" in render_template
  141.         output = template.render(context)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  123.             return self._render(context)
File "C:\Python\lib\site-packages\django\test\utils.py" in instrumented_test_render
  57.     return self.nodelist.render(context)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "C:\Python\lib\site-packages\django\template\debug.py" in render_node
  73.             result = node.render(context)
File "C:\Python\lib\site-packages\django\template\defaulttags.py" in render
  227.                 nodelist.append(node.render(context))
File "C:\Python\lib\site-packages\django\template\defaulttags.py" in render
  311.             return self.nodelist_true.render(context)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "C:\Python\lib\site-packages\django\template\debug.py" in render_node
  73.             result = node.render(context)
File "C:\Python\lib\site-packages\django\template\defaulttags.py" in render
  311.             return self.nodelist_true.render(context)
File "C:\Python\lib\site-packages\django\template\base.py" in render
  744.                 bits.append(self.render_node(node, context))
File "C:\Python\lib\site-packages\django\template\debug.py" in render_node
  73.             result = node.render(context)
File "C:\Python\lib\site-packages\django\template\debug.py" in render
  92.             output = force_unicode(output)
File "C:\Python\lib\site-packages\django\utils\encoding.py" in force_unicode
  71.                 s = unicode(s)

Exception Type: TemplateSyntaxError at /admin/image/celebrity/3/
Exception Value: Caught TypeError while rendering: coercing to Unicode: need string or buffer, ImageFieldFile found

I also tried the MEDIA_ROOT like:

MEDIA_ROOT = os.path.join(os.path.dirname(file), "media").replace(r"\\", "//"),

or

MEDIA_ROOT = os.path.join(os.path.dirname(file), "media").replace("\\", "//"),

but then not even the upload works

So I am really clueless. Any help is highly appreciated

, 'django.views.static.serve', { 'document_root': 'c:/python/django/apps/af/neu/images/media/files' }), # Uncomment the next line to enable the admin: url(r'^admin/', include(admin.site.urls)),

With this configuration the upload works, but when I am trying to edit then I get the following traceback:

I also tried the MEDIA_ROOT like:

or

but then not even the upload works

So I am really clueless. Any help is highly appreciated

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

血之狂魔 2024-11-10 16:35:06

只需更改 Image 类的 unicode 函数

class Image(models.Model):
    celebrity = models.ForeignKey(Celebrity)
    image = models.ImageField('Bild', upload_to="files/")

    def __unicode__(self):
       return self.image.name

即可noreferrer">这个讨论供参考。我引用这个错误的原因:

这个问题终于和表单无关了
它们本身,而是图像模型的 unicode 方法。
ImageField 的旧实现有自己的 unicode 方法,因此

def __unicode__(self):
     return self.file

工作得很好。现在需要这样

def __unicode__(self):
    return self.file.name

达到相同的结果。

Just change your unicode function of Image class

class Image(models.Model):
    celebrity = models.ForeignKey(Celebrity)
    image = models.ImageField('Bild', upload_to="files/")

    def __unicode__(self):
       return self.image.name

You an also refer to this discussion for reference.I am quoting the reason of this error:

The problem with this issue finally had nothing to do with the forms
themselves, but the unicode method of the Image-model.
Older implementations of ImageField had a unicode method of their own so

def __unicode__(self):
     return self.file

worked fine. Now this needs to be

def __unicode__(self):
    return self.file.name

to achieve the same result.

破晓 2024-11-10 16:35:06

回溯告诉您到底发生了什么。错误出现在 Image 类的 __unicode__ 方法中 - 您在那里返回 image 属性,但这不是一个字符串,所以可以不输出为 unicode。

尝试返回image.url

The traceback tells you exactly what is going on. The error is in the __unicode__ method of the Image class - you're returning the image property there, but that's not a string, so can't be output as unicode.

Try returning image.url instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文