2012-05-21 2 views
0

У меня есть база данных Django, полная городов. Я хотел бы использовать панель администратора Django для загрузки нескольких фотографий каждого города на мой сервер в некоторых папках say/images/country_name/state/city /. Это, вероятно, будет добавлено в форму администратора города, так что изображения и информация могут быть отредактированы на одной странице. Мне также нужно выбрать основное изображение и преобразовать его в миниатюру, чтобы его можно было использовать в результатах поиска. Каковы хорошие способы реализации этого типа функциональности? Есть ли хорошие дополнения django, которые могли бы помочь мне справиться с этими задачами?Загрузка изображений в Django Admin

ответ

4

вы можете сделать пару моделей, связанных друг с другом и добавить изображение в качестве TabularInline в Джанго-администратора, как:

# models.py 
class City(models.Model): 
    # your fields 

class CityImage(models.Model): 
    city = models.ForeignKey('City', related_name='images') 
    image = models.ImageField(upload_to=image_upload_path) 

# admin.py 
from django.contrib import admin 
from myapp.models import City, CityImage 


class CityImageInline(admin.TabularInline): 
    model = CityImage 


class CityAdmin(admin.ModelAdmin): 
    inlines = [CityImageInline] 


admin.site.register(City, CityAdmin) 

Что касается эскиза, вы должны были бы в вашей City модели таким образом, чтобы решить, какой из связанных изображений вы хотите использовать в качестве эскиза, а затем сделать что-то вроде:

import Image 
try: 
    from cStringIO import StringIO 
except ImportError: 
    from StringIO import StringIO 
from django.core.files.base import ContentFile 

# other imports and models 

class City(models.Model): 
    # your fields 

    def get_thumbnail(self, thumb_size=None): 
     # find a way to choose one of the uploaded images and 
     # assign it to `chosen_image`. 
     base = Image.open(StringIO(chosen_image.image.read())) # get the image 

     size = thumb_size 
     if not thumb_size: 
      # set a default thumbnail size if no `thumb_size` is given 
      rate = 0.2 # 20% of the original size 
      size = base.size 
      size = (int(size[0] * rate), int(size[1] * rate)) 

     base.thumbnail(size) # make the thumbnail 
     thumbnail = StringIO() 
     base.save(thumbnail, 'PNG') 
     thumbnail = ContentFile(thumbnail.getvalue()) # turn the tumbnail to a "savable" object 
     return thumbnail 

Надеюсь, это пригодится! :)

+0

Можете ли вы изменить путь загрузки ImageField динамически? Чтобы я мог загружать изображения в/images/country_name/state_name/city_name/например? – HighLife

+1

Да, вы можете. upload_to может быть функцией, которая возвращает путь. Проверьте это: https://docs.djangoproject.com/en/1.4/ref/models/fields/#django.db.models.FileField.upload_to – Gerard

Смежные вопросы