2015-10-05 7 views
0

я возился с Джанго ImageField,
и я получил следующие модели, напримеризображение не оказывается в Django

class Card(models.Model): 
    name  = models.TextField() 
    mana  = models.IntegerField() 
    rarity  = models.IntegerField(choices=RARITY_CHOICES) 
    card_class = models.IntegerField(choices=CLASS_CHOICES) 
    card_set = models.IntegerField(choices=SET_CHOICES) 
    card_type = models.IntegerField(choices=TYPE_CHOICES) 

    def __unicode__(self): 
     return self.name 

class Weapon(Card): 
    damage  = models.already created a deck with some cards in the django admin interface. Now finally I wanted to render it with a custom view in my template with this viewIntegerField() 
    durability = models.IntegerField() 
    image  = models.ImageField(upload_to='/home/ubuntu/illuminated/media/images/weapons/') 

class Deck(models.Model): 
    name   = models.CharField(max_length=20) 
    spell_cards  = models.ManyToManyField(Spell, blank=True) 
    weapon_cards = models.ManyToManyField(Weapon, blank=True) 
    minion_cards = models.ManyToManyField(Minion, blank=True) 

Я уже создал колоду с некоторыми картами в интерфейсе Джанго администратора. Теперь, наконец, я хотел, чтобы сделать это с настраиваемым представлением в моем шаблоне с этим точкой зрения

class ShowDeck(TemplateView): 
    template_name = 'hsguides/deck.html' 

    def get_context_data(self, **kwargs): 
     context = super(ShowDeck, self).get_context_data(**kwargs) 
     context['deck'] = Deck.objects.all() 
     return context 

И этим простым шаблоном уже создал колоду с некоторыми картами в интерфейсе Джанго администратора. Теперь, наконец, я хотел, чтобы сделать это с настраиваемое представление в моем шаблоне с этой точки зрения

{% for foo in deck.all %} 
    {{ foo.name }} 
    <br> 
    {% for weapon in foo.weapon_cards.all %} 
    {{ weapon.name }} 
    <img src="{{ weapon.image }}" height="{{ weapon.image.height }}" width="{{ weapon.image.width }}"> 
    {% endfor %} 
{% endfor %} 

Имена становятся оказанной, и когда у меня есть взгляд на исходный код страницы URL-адрес изображения, ширина и высота, как хорошо, но изображение просто не отображается.
Когда я нажимаю на View Image в моем браузере я вижу следующую ошибку

Используя URLconf, определенный в illuminated.urls, Django пробовал эти шаблоны URL , в следующем порядке:

^admin/ 
^account/ 
^guides/ 

текущий URL, главная/Ubuntu/освещение/СМИ/изображения/оружие/Truesilver_Champion_Gold_ktmWGK8.png, не соответствует ни одному из этих

В настоящее время выглядит следующим образом

enter image description here

Источник страница выглядит как этот

Basic Paladin 
    <br> 

    Truesilver Champion 
    <img src="/home/ubuntu/illuminated/media/images/weapons/Truesilver_Champion_Gold_ktmWGK8.png" height="396" width="289"> 

Любой вид помощи высоко ценится!

ответ

2

Короче:


Установите атрибут upload_to в images/weapons/ и добавить

url(r'^media/(?P<path>.*)$', 'django.views.static.serve', 
     {'document_root': MEDIA_ROOT}), 

в корневой urls.py.

Также убедитесь, что в настройках вы определяете MEDIA_ROOT и MEDIA_URL:

BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 
MEDIA_URL = '/media/' 
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 

Объяснение:


В вашей models.py вы устанавливаете атрибут upload_to в ImageField в class Weapon Ань абсолютный путь в локальной файловой системе: /home/ubuntu/illuminated/media/images/weapons.

В контексте вашего браузера, однако любой путь, начинающийся с /, интерпретируется как абсолютный относительно хоста. Если ваше имя хоста является localhost и ваш сервер работает на порту 8000, он будет искать файл http://localhost:8000/home/ubuntu/......./weapons/file.jpg.

Когда django обрабатывает запрос, он пытается сопоставить запрошенный путь, который начинается с home, но поскольку у вас нет маршрута, настроенного для разрешения home, вы получаете эту ошибку.

+0

Большое спасибо за ваш ответ «В контексте вашего браузера, однако любой путь, начинающийся с /, интерпретируется как абсолютный относительно хоста». Это имело смысл! : D –