Template error:
在模板D:\ virtualEnv \ alumni \ member \ templates \ member \ index.html中,第15行出错
The 'photo' attribute has no file associated with it. 5 : <!-- Albums -->
6 : <div class="row">
7 : <div class="col-sm-12">
8 : <h3>{{ user.username }}'s Albums</h3>
9 : </div>
10 : {% if all_persons %}
11 : {% for person in all_persons %}
12 : <div class="col-sm-4 col-lg-2">
13 : <div class="thumbnail">
14 : <a href="{% url 'member:detail' person.id %}">
15 : <img src=" {{ person.photo.url }} " class="img-responsive">
16 : </a>
17 : <div class="caption">
18 : <h2>{{ person.name }}</h2>
19 : <h4>{{ person.category }}</h4>
20 :
21 : <!-- View Details -->
22 : <a href="{% url 'member:detail' person.id %}" class="btn btn-primary btn-sm" role="button">View Details</a>
23 :
24 :
25 :
回溯:
_resolve_lookup中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ base.py” 885. current = current [bit]
在处理上述异常('ImageFieldFile'对象不可订阅)期间,发生了另一个异常:
内部文件“D:\ virtualEnv \ lib \ site-packages \ django \ core \ handlers \ exception.py” 39. response = get_response(request)
_get_response中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ core \ handlers \ base.py” 217. response = self.process_exception_by_middleware(e,request)
_get_response中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ core \ handlers \ base.py” 215. response = response.render()
渲染中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ response.py” 109. self.content = self.rendered_content
render_content中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ response.py” 86. content = template.render(context,self._request)
渲染中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ backends \ django.py” 66. return self.template.render(context)
渲染中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ base.py” 208. return self._render(context)
_render中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ base.py” 199. return self.nodelist.render(context)
渲染中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ base.py” 994. bit = node.render_annotated(context)
render_annotated中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ base.py” 961. return self.render(context)
渲染中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ loader_tags.py” 61. result = self.nodelist.render(context)
渲染中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ base.py” 994. bit = node.render_annotated(context)
render_annotated中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ base.py” 961. return self.render(context)
渲染中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ defaulttags.py” 323. return nodelist.render(context)
渲染中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ base.py” 994. bit = node.render_annotated(context)
render_annotated中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ base.py” 961. return self.render(context)
渲染中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ defaulttags.py” 217. nodelist.append(node.render_annotated(context))
render_annotated中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ base.py” 961. return self.render(context)
渲染中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ base.py” 1044. output = self.filter_expression.resolve(context)
解析文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ base.py” 711. obj = self.var.resolve(context)
解析文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ base.py” 852. value = self._resolve_lookup(context)
_resolve_lookup中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ template \ base.py” 893. current = getattr(current,bit)
_get_url中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ db \ models \ fields \ files.py” 68. self._require_file()
_require_file中的文件“D:\ virtualEnv \ lib \ site-packages \ django \ db \ models \ fields \ files.py” 46.引发ValueError(“'%s'属性没有与之关联的文件。”%self.field.name)
异常类型:ValueError at / 例外值:'photo'属性没有与之关联的文件。
我的观点:
class IndexView(generic.ListView):
template_name = 'member/index.html'
context_object_name = 'all_persons'
def get_queryset(self):
return Person.objects.all()
class DetailView(generic.DetailView):
model = Person
template_name = 'member/detail.html'
class AlbumCreate(CreateView):
model = Person
fields = '__all__'
我的模特是:
class Person(models.Model):
name = models.CharField(max_length=128)
present_position=models.CharField(max_length=100)
organization= models.CharField(max_length=150,blank=True)
address = models.CharField(max_length=150, blank=True)
tele_land = models.CharField(max_length=15,blank=True)
tele_cell = models.CharField(max_length=15, blank=True)
email = models.EmailField(max_length=70, blank=True, null=True, unique=True)
photo= models.ImageField(upload_to='persons/%Y/%m/%d/',max_length=70, blank=True )
category = models.ForeignKey('Membership', on_delete=models.CASCADE)
def get_absolute_url(self):
return reverse('member:detail', kwargs={'pk': self.pk})
class Membership(models.Model):
category = models.CharField(max_length=50, blank=False)
URSL:
from . import views
app_name = 'member'
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
url(r'member/add/$', views.AlbumCreate.as_view(), name='member-add'),
]
详细模板:
<div class="col-sm-4 col-md-3">
<div class="panel panel-default">
<div class="panel-body">
<a href="{% url 'member:detail' person.id %}">
{% if member.photo %}
<img src="{{ member.photo.url }}" class="img-responsive">
{% else %}
<h3>No image to display</h3>
{% endif %}
</a>
<p>{{member.name}}</p>
<p>{{member.present_position}}</p>
<p>{{member.organization}}</p>
<p>{{member.address}}</p>
<p>{{member.tele_land}}</p>
<p>{{member.tele_cell}}</p>
<p>{{member.email}}</p>
</div>
</div>
</div>
项目网址:
from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static
from member import urls as member_urls
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include(member_urls, namespace="member")),
]
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
为什么照片字段会出现这些错误?
答案 0 :(得分:2)
我在Model:
中使用Stackoverflow的答案解决了这个问题@property
def photo_url(self):
if self.photo and hasattr(self.photo, 'url'):
return self.photo.url
在模板中,使用default_if_none作为默认网址:
<img src="{{ person.photo_url|default_if_none:'#' }}" />
经过多次搜索和花费多次,这实际上为我提供了正确的答案。
希望它能帮助其他人在django模板中加载图片。
答案 1 :(得分:0)
尝试通过不调用没有FileField
部分的.url
字段/属性名称来返回“完整URL”,例如person.photo
而非person.photo.url
。
N / B:我仅在 DRF(djangorestframework)序列化器类中的REST API上对其进行了测试,但不确定它是否适用于django模板,但值得一试
答案 2 :(得分:0)
我亲爱的朋友,ohid的解决方法不错,但还不够,因为如果用户没有个人头像,则应显示默认图像。因此,您可以按照以下步骤操作:
将此方法添加到您的个人模型中:
@property
def get_photo_url(self):
if self.photo and hasattr(self.photo, 'url'):
return self.photo.url
else:
return "/static/images/user.jpg"
您可以使用任何路径(/ media,/ static等),但不要忘记将默认用户照片作为user.jpg放置到路径中。
并按如下所示在模板中更改代码:
<img src="{{ person.get_photo_url }}" class="img-responsive thumbnail " alt="img">
答案 3 :(得分:0)
可能是您的 ImageField
在某个时候没有获得任何图像,但在其他地方您正尝试使用图像的路径(不存在)。其他人也指出了同样的事情。当您在保存图像之前尝试预处理图像时,这可能发生在模板 {{ post.post_image.url }}
或 views.py
中,甚至 models.py
中。无论在哪里使用它都要小心并使用 try-except
块。
from PIL import Image # I was using pillow to pre-process
...
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
try:
img = Image.open(self.post_image.path)
except:
print("Do something.. break or return")
return
答案 4 :(得分:0)
删除之前所有没有图像属性或使用的记录
<img src="{{ person.photo_url|default_if_none:'#' }}" />