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

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

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

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

Python

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

Q&A

解決済

1回答

419閲覧

djangoのtemplate内において、loopを使わずにブログタイトルを1つづつ表示させる。

superyamadaman

総合スコア13

Django

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

Python

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

0グッド

0クリップ

投稿2017/09/12 14:19

編集2017/09/14 07:55

現在、djangoにおいてbootstrapを使用した簡単なブログサイトを構築中です。

このブログ構築において、自分が使用予定のbootstrapテーマのhtmlが以下のような構造になっているのですが、この構造において、{% for post in posts %}などのループを使用して、{{ post.title }}に順々にブログのタイトルを当てはめていく方法が分かりません。

この方法をご教示頂けませんでしょうか。

以下に問題の説明用の簡単なサンプルコードとサイトのデザインイメージを記載致します。

イメージ説明

list.html <body> <div class="box-sample"> <div class="box-sample-1"> <p>{{ post.title }} </p> <!--タイトルその1--> </div> <div class="box-sample-2"> <div class="box-sample-2-1"> <p>{{ post.title }}</p> <!--タイトルその2--> </div> <div class="box-sample-2-2"> <p>{{ post.title }}</p> <!--タイトルその3--> </div> </div> </div> </body>

gjangoにおいてブログの記事タイトルやサマリーをタグで当てはめる方法として、書籍やネット上記事では、ブログ記事のタイトルや著者、本文の要約部分を一括りにして、ループで挟む方法をよく見かけます。
この方法を参考にして、以下の3つの方法を行ってみたのですが、それぞれに問題があり、自分のやりたいことが実現できません。

  1. <div class="box-sample">をループで挟む方法。

→この方法の場合、添付画像のデザイン自体がループすることになり、自分の考えているデザインとは違ったデザインになってしまいます。

  1. {{ post.title }}のタイトルのすぐ上にある<div class="box-sample-*">にクラスを与え、一括りにしてループで挟む方法。

→例えば<div class="box-sample-1">を挟むと、<div class="box-sample-1">がループするので、デザインが崩れてしまいます。
0. <div class="box-sample-1"><div class="box-sample-2-2">などのそれぞれの要素ごとにループを適用する方法
→当然のことながら、各要素に最新の同じ記事タイトルが表示される結果になります。

上記以外の解決策として、このhtml構成においてはループの使用がそもそも難しいと考え、ループで挟むことを止め、{{ post.title }}にフィルターや引数などを入れることで、ブログタイトルを順に表示させることはできないか考えました。この考えを基にして、適用できそうなフィルターや引数を探してみたのですが、見つけることができませんでした。

下記にdjangoにおけるHTML以外のファイル構成と内容を記載致しますので、これらのファイルにどのような要素を追加、もしくは変更すればよいがご教示頂けませんでしょうか。

プログラミング初心者のため、誠に拙い説明で申し訳ございませんが、何卒ご教示のほど宜しくお願い致します。

model.py from django.db import models from django.utils import timezone from django.contrib.auth.models import User from django.core.urlresolvers import reverse class Post(models.Model): STATUS_CHOICES = ( ('draft', 'Draft'), ('published', 'Published'), ) title = models.CharField(max_length=250) class Meta: ordering = ('-publish',) def __str__(self): return self.title view.py rom django.shortcuts import render, get_object_or_404 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.views.generic import ListView class PostListView(ListView): queryset = Post.published.all() context_object_name = 'posts' paginate_by = 10 template_name = 't_env/post/list.html' def post_detail(request, year, month, day, post): post = get_object_or_404(Post, slug=post, status='published', publish__year=year, publish__month=month, publish__day=day) return render(request, 't_env/post/detail.html', {'post': post})

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

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

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

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

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

guest

回答1

0

ベストアンサー

引用テキスト私の試行錯誤として、list.htmlの中の {% for post in posts %}を外したあと、{{ post.title }}の部分に、フィルターや引数などを設定するとうまくいくかと思ったのですが、うまくいきませんでした。

変数{{post}}は{% for post in posts %}を使うことで初めて使うことができるのでfor文を外すと使えなくなると思いますよ。

少し複雑な構造

の部分を具体的にもう少し教えてもらえるとアドバイスができるかもしれません。
若干無理矢理な感じはしますが、
複雑なHTML文を出力する必要があるならclass Postにその出力をするmethodをもたせれば
for文で回せると思います。

投稿2017/09/13 21:38

acre_maker

総合スコア145

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

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

superyamadaman

2017/09/14 07:57

ご回答頂きまして、誠にありがとうございました。 自分の説明に、不足している部分が多くあると考え、全面的に書き換えてみました。 上記の修正した文面を基にして、アドバイス頂けるのであれば、とてもうれしく思います。 何卒よろしくお願い致します。
acre_maker

2017/09/14 09:57 編集

追記確認しました!丁寧にありがとうございます。 まずホームページのデザインを見て一つ目だけ左側に表示したいなどというように ループの最初だけ別のことをしたい場合は組み込みタグの一つである forloop.first と言うものを使ってif文を書けば良いと思います。 {% if forloop.first %} やりたいこと {% endif %} と言った感じですね。 さらに今回の場合各classがbox-sample-2-1, box-sample-2-2, ... と違うようですね。 なかなか手ごわいですがやはり組み込みタグの一つである forloop.counter を使えばできると思います。 いかがでしょうか? 組み込みタグに関するドキュメントはこちらです。 https://docs.djangoproject.com/ja/1.11/ref/templates/builtins/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問