2015-01-28 2 views
0

Я хочу, чтобы иметь возможность перечислить все фотографии в альбоме, но я не знаю, как это сделать. Сейчас я получаю сообщение об ошибке:Отображение всех фотографий в альбоме в list_display

AttributeError at /admin/portfolio/album/ 
'ImageFieldFile' object has no attribute 'title' 

Traceback:

File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response 
    137.     response = response.render() 
File "/Library/Python/2.7/site-packages/django/template/response.py" in render 
    103.    self.content = self.rendered_content 
File "/Library/Python/2.7/site-packages/django/template/response.py" in rendered_content 
    80.   content = template.render(context) 
File "/Library/Python/2.7/site-packages/django/template/base.py" in render 
    148.    return self._render(context) 
File "/Library/Python/2.7/site-packages/django/template/base.py" in _render 
    142.   return self.nodelist.render(context) 
File "/Library/Python/2.7/site-packages/django/template/base.py" in render 
    844.     bit = self.render_node(node, context) 
File "/Library/Python/2.7/site-packages/django/template/debug.py" in render_node 
    80.    return node.render(context) 
File "/Library/Python/2.7/site-packages/django/template/loader_tags.py" in render 
    126.   return compiled_parent._render(context) 
File "/Library/Python/2.7/site-packages/django/template/base.py" in _render 
    142.   return self.nodelist.render(context) 
File "/Library/Python/2.7/site-packages/django/template/base.py" in render 
    844.     bit = self.render_node(node, context) 
File "/Library/Python/2.7/site-packages/django/template/debug.py" in render_node 
    80.    return node.render(context) 
File "/Library/Python/2.7/site-packages/django/template/loader_tags.py" in render 
    126.   return compiled_parent._render(context) 
File "/Library/Python/2.7/site-packages/django/template/base.py" in _render 
    142.   return self.nodelist.render(context) 
File "/Library/Python/2.7/site-packages/django/template/base.py" in render 
    844.     bit = self.render_node(node, context) 
File "/Library/Python/2.7/site-packages/django/template/debug.py" in render_node 
    80.    return node.render(context) 
File "/Library/Python/2.7/site-packages/django/template/loader_tags.py" in render 
    65.     result = block.nodelist.render(context) 
File "/Library/Python/2.7/site-packages/django/template/base.py" in render 
    844.     bit = self.render_node(node, context) 
File "/Library/Python/2.7/site-packages/django/template/debug.py" in render_node 
    80.    return node.render(context) 
File "/Library/Python/2.7/site-packages/django/template/loader_tags.py" in render 
    65.     result = block.nodelist.render(context) 
File "/Library/Python/2.7/site-packages/django/template/base.py" in render 
    844.     bit = self.render_node(node, context) 
File "/Library/Python/2.7/site-packages/django/template/debug.py" in render_node 
    80.    return node.render(context) 
File "/Library/Python/2.7/site-packages/django/template/base.py" in render 
    1207.      _dict = func(*resolved_args, **resolved_kwargs) 
File "/Library/Python/2.7/site-packages/django/contrib/admin/templatetags/admin_list.py" in result_list 
    316.    'results': list(results(cl))} 
File "/Library/Python/2.7/site-packages/django/contrib/admin/templatetags/admin_list.py" in results 
    292.    yield ResultList(None, items_for_result(cl, res, None)) 
File "/Library/Python/2.7/site-packages/django/contrib/admin/templatetags/admin_list.py" in __init__ 
    283.   super(ResultList, self).__init__(*items) 
File "/Library/Python/2.7/site-packages/django/contrib/admin/templatetags/admin_list.py" in items_for_result 
    198.    f, attr, value = lookup_field(field_name, result, cl.model_admin) 
File "/Library/Python/2.7/site-packages/django/contrib/admin/utils.py" in lookup_field 
    280.     value = attr() 
File "/Users/bli1/Development/Django/Boothie/portfolio/models.py" in images 
    22.   lst = [x.photo.title for x in self.photo_set.all()] 

Exception Type: AttributeError at /admin/portfolio/album/ 
Exception Value: 'ImageFieldFile' object has no attribute 'title' 

models.py:

class Album(models.Model): 
    title = models.CharField(max_length=50, unique=True) 
    # thumbnail = models.ImageField() 

    def __str__(self): 
     return self.title 

    def images(self): 
     lst = [x.photo.title for x in self.photo_set.all()] 
     return lst 

    def save(self, *args, **kwargs): 
     # super(Album, self).save(*args, **kwargs) 
     rgx = re.search(r'.*\w', self.title) 
     self.title = rgx.group(0).replace(" ", "_") 
     super(Album, self).save(*args, **kwargs) 


class AlbumAdmin(admin.ModelAdmin): 
    # Set search_fields to enable a search box on the admin change list page. 
    # This should be set to a list of field names that will be searched whenever 
    # somebody submits a search query in that text box. 
    search_fields = ["title"] 
    # Set list_display to control which fields are displayed on the change list page of the admin. 
    # list_display = ["title", "images"] 
    list_display = ["images"] 


def upload_path(instance, filename): 
    if " " in instance.album.title: 
     instance.album.title.replace(" ", "_") 
    return '/'.join([instance.album.title, filename]) 


class Photo(models.Model): 
    title = models.CharField(max_length=50, blank=True) 
    album = models.ForeignKey(Album) 
    photo = models.ImageField(upload_to=upload_path) 
    # width = models.IntegerField(blank=True, null=True) 
    # height = models.IntegerField(blank=True, null=True) 
    upload = models.DateTimeField(auto_now_add=True) 
    # thumbnail = models.ImageField() 

ответ

1

Проблема эта линия:

lst = [x.photo.title for x in self.photo_set.all()] 

self.photo_set.all() возвращает набор запросов photo с. Переменная x - это фотография и x.photo - это поле для фотографий. Поэтому x.photo.title поднимает AttributeError, потому что поле не имеет атрибута title. Попробуйте x.title вместо:

lst = [x.title for x in self.photo_set.all()] 

Если вы хотите, чтобы отобразить результат, было бы лучше, чтобы вернуть строку вместо списка:

titles = ", ".join(x.title for x in self.photo_set.all()) 
return titles 
Смежные вопросы