質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1035閲覧

(CRUDアプリ)記事のカテゴリに合わせたアイコン画像を表示させたい

minari766

総合スコア17

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/05/02 09:11

編集2021/05/25 22:45

###実現したいこと
DjangoのCRUDアプリにて、投稿記事のカテゴリに合わせたアイコンを表示したいと考えております。

(参考画像:赤線で囲った部分が表示するアイコンです)
イメージ説明

後述のapp/index.htmlの"アイコン部分"に記載の通り、if文を使えば変数categoryに合った画像を表示してくれるかと思いましたが、画像読み込みに失敗した際の画像(参考画像の虫眼鏡マーク)しか表示されません。

なお、views.pyにてprint(post_data.category)を入力し、category名がcategory1となっていることを確認しております。

これ以上どこに問題があるかがわからず、ご知見いただけますと幸いです。

###各種コード
必要と思う部分のみ記載しております。
情報に不足ありましたらご指摘いただけますと幸いです。

HTML(記事一覧ページ)
app/index.html

HTML

1<div class="col-md-8"> 2 <div class="author-created"> 3 <h7 class="text_left"> 4 {% if post.author.icon %} 5 <img src="{{ post.author.icon.url }}" class="user-icon-top"> 6 {% else %} 7 <img src="{% static 'img/user1.png' %}" class="user-icon-top"> 8 {% endif %} 9 {{ post.author }} 10 </h7> 11 <h7 class="text_right">{{ post.created }}</h7> 12 </div> 13 <div class="article-container"> 14 <h3>{{ post.title|truncatechars:17}}</h3> 15    <!--アイコン部分--> 16 <div> 17 {% if post_data.category == "category1" %} 18 <img src="{% static 'img/category1.png' %}" alt="カテゴリ1" class=""article-category-icon> 19 {% elif post_data.category == "category2" %} 20 <img src="{% static 'img/category2.png' %}" alt="カテゴリ2" class="article-category-icon"> 21 {% elif post_data.category == "category3" %} 22 <img src="{% static 'img/category3.png' %}" alt="カテゴリ3" class="article-category-icon"> 23 {% else %} 24 <img src="{% static 'img/search.png' %}" alt="該当カテゴリなし" class="article-category-icon"> 25 {% endif %} 26 </div> 27 </div> 28</div>

views.py

python

1from django.http import JsonResponse 2from django.views.generic import View 3from django.shortcuts import render,redirect, get_object_or_404 4from .models import Post, Category 5from .forms import PostForm 6from django.contrib.auth.mixins import LoginRequiredMixin 7 8class IndexView(View): 9 def category_select(self, post_data, category): 10 if category == "all" : 11 post_data = post_data 12 elif category != None : 13 category_data = Category.objects.get(slug=category) 14 post_data = post_data.filter(category=category_data) 15 elif category is None : 16 post_data = post_data 17 return post_data 18 19 def get(self, request, *args, **kwargs): 20 post_data = Post.objects.order_by("-id") 21 category = self.kwargs.get('category') 22 post_data = self.category_select(post_data, category) 23 24 return render(request, 'app/index.html', { 25 'post_data': page_obj.object_list, 26 'page_obj': page_obj, 27 'category': category, 28 })

models.py

python

1from django.conf import settings 2from django.db import models 3from django.utils import timezone 4 5class Category(models.Model): 6 name = models.CharField("カテゴリ", max_length=100) 7 slug = models.SlugField("スラッグ") 8 9 def __str__(self): 10 return self.name 11 12class Post(models.Model): 13 author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) 14 category = models.ForeignKey(Category, verbose_name='カテゴリ', on_delete=models.CASCADE) 15 title = models.CharField("タイトル", max_length=200) 16 image = models.ImageField(upload_to='images', verbose_name='Image画像', null=True, blank=True) 17 content = models.TextField("本文") 18 created = models.DateTimeField("作成日", default=timezone.now) 19 20 def __str__(self): 21 return self.title

forms.py

python

1from django import forms 2from .models import Category 3 4class PostForm(forms.Form): 5 6 category_data = Category.objects.all() 7 category_choice = {} 8 for category in category_data: 9 category_choice[category] = category 10 11 title = forms.CharField(max_length=50, label='タイトル') 12 category = forms.ChoiceField(label='カテゴリ', widget=forms.Select, choices=list(category_choice.items())) 13 content = forms.CharField(label='内容', widget=forms.Textarea()) 14 image = forms.ImageField(label='イメージ画像', required=False) 15 print(category) 16

###試したこと
・index.htmlのif文を削除し、category1.pngを呼びだすコードのみに変更
→category1.png画像が表示されたため、画像へのルーティングに問題があるわけではないと考えます。

###環境
HTML5
Bootstrap 4.7.0
Python 3.6.3
Django 2.2.16

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

{% if post_data.category|stringformat:"s" == "category1" %}

これでどうでしょうか?
post_data.categoryがstr型でない為、if文が全てFalseになっているような気がします。

type()でpost_data.categoryの型を確認すると
"●●●.models.Category"となっていると思います。

投稿2021/05/28 13:06

TechChuna

総合スコア86

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minari766

2021/05/28 15:03

ご回答有り難うございます。 ご指定の方法で解決しました!!ずっと悩まされていた問題だったので本当に感謝しております。 stringformat:はstr型とint型を変更する機能で、stringformat:"s"でstr型へ、stringformat:"i"でint型になると認識致しました。 views.pyにてprint(post_data.category)でターミナルへ表示したのがstr型(日本語)だったので、=="category1"でTrueになるかと思っておりました。 今一度内容理解に努めます。 本当に有り難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問