django模板“文件名太长”

0 投票
1 回答
3371 浏览
提问于 2025-04-16 05:51

我刚接触Python和Django,可能有人能给我指个方向。

我有以下这一行在url.py文件里:

      url(r'^$', direct_to_template,
                  {'template':'index.html',
                  'extra_context':{'featured_actors': lambda: User.objects
                                    .annotate(avatars_nb=Count('avatar'))
                                    .filter(actor_profile__is_featured=True, avatars_nb__gt=0)
                                    .order_by('?')[:4]},
                 }, name='index'),

之前这一切都运行得很好,但不知道为什么,突然间我遇到了这个模板错误。

 TemplateSyntaxError at /
 Caught an exception while rendering: (36, 'File name too long')

在第70行。

 66   {% if featured_actors|length %}
 67       <div id="featured"> 
 68         <h2>Featured Actors: </h2>
 69         <ul>
 70             {% for actor in featured_actors %}
 71             <li> 
 72                 <a href="{% url public_profile actor.username %}">
 73                     <img src="{% avatar_itself_url actor.avatar_set.all.0 200 %}" alt="{{ actor.profile.firstname }} {{ actor.profile.lastname }}" style="max-width:140px" height="200"/> 
 74                 </a>
 75             </li>
 76             {% endfor %}

调试这个问题的最好方法是什么?

更新:

 126     def avatar_url(self, size):
 127         return self.avatar.storage.url(self.avatar_name(size))

我想我找到了一点问题,某个用户的个人资料也出现了同样的错误。所以我觉得可能是他的头像/图片路径太长了。我正在试着进一步缩小问题范围……

1 个回答

2

可能你的图片路径 {% avatar_itself_url actor.avatar_set.all.0 200 %} 太长了。你可以试着删掉那一行 <img ...,看看模板能不能正常显示?

如果这样能显示出来,你可以在 python manage.py shell 里检查一下你的图片路径长度吗?它的长度超过255个字符了吗?

对评论的回答

你的图片路径确实太长了,我的意思是:

<img src="/this/is/a/very/long/path/which/exceeds/255/characters/something.png" />

上面的路径虽然不是255个字符长,但你大概明白我的意思。这个路径可能非常长。试着找出这个路径是什么,并计算一下它的长度。avatar_itself_url 是怎么实现的?Avatar 的unicode是什么?它返回了什么?你有没有一个名字特别长的Avatar?

重现错误信息

下面是你可以用python重现错误信息的方法。在python脚本中运行以下代码:

long_filename = 'a' * 256
fp = open(long_filename, 'w')
fp.close()

运行后应该会返回这个信息:IOError: [Errno 36] File name too long:

显示图片路径

你能把html中的img标签替换成它的内容吗:{% avatar_itself_url actor.avatar_set.all.0 200 %}? 这样你就能看到图片的路径,而不是图片本身。看一下这个路径,如果超过256个字符,应该不成问题。

撰写回答