0

私は django をいじりImageField
たとえば次のモデルを取得しました

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)

Django管理インターフェースでいくつかのカードを含むデッキをすでに作成しました。最後に、このビューを使用して、テンプレートのカスタム ビューでレンダリングしたいと考えました。

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

そして、この単純なテンプレートは、django 管理インターフェースでいくつかのカードを含むデッキをすでに作成しています。最後に、このビューを使用して、テンプレートのカスタム ビューでレンダリングしたいと考えました。

{% 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
] をクリックすると、次のエラーが表示されます

illuminated.urls で定義された URLconf を使用して、Django は次の URL パターンを次の順序で試しました。

^admin/
^account/
^guides/

現在の URL、home/ubuntu/illuminated/media/images/weapons/Truesilver_Champion_Gold_ktmWGK8.png は、これらのいずれにも一致しませんでした

現在はこんな感じ

ここに画像の説明を入力

ページソースはこんな感じ

  Basic Paladin
  <br>

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

どんな種類の助けも大歓迎です!

4

1 に答える 1

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 属性をローカルファイルシステムの絶対パスに設定しています: .ImageFieldclass Weapon/home/ubuntu/illuminated/media/images/weapons

ただし、ブラウザのコンテキストでは、で始まるパス/はホストに関して絶対パスとして解釈されます。ホスト名が localhost で、サーバーがポート 8000 で実行されている場合、サーバーはファイルを探します http://localhost:8000/home/ubuntu/......./weapons/file.jpg

django がリクエストを処理するとき、 で始まるリクエストされたパスを照合しようとしhomeますが、解決するようにルートが設定されていないhomeため、このエラーが発生します。

于 2015-10-05T09:19:50.723 に答える