2016-09-02 10 views
0

モデルのインスタンスがほとんどありません。Djangoの反復(for ... in ...)異なるdivに入れる方法は?

私のモデル:

class Record(models.Model): 
    name = models.ForeignKey(Car) 
    image = models.ImageField(upload_to='images/') 
    created = models.DateTimeField(
      default=timezone.now) 

ビュー:

def allrecords(request): 
    records = Record.objects.all().order_by('created') 
    return render(request, 'mycar/allrecords.html', {'records' : records}) 

私は私のウェブサイト上でそれを表示します。

{% for record in records %} 
    <img src={{ record.image.url}}/> 
    <div> 
     {{record.name}} 
    </div> 
{% endfor %} 

は、今私は私のレコードのリストを取得しますが、私はそれを行うことができますどのように次など第二に、最初のdivに最新のレコードを入れたいと思います:私のテンプレートでは私が持っていますか?

は、私は私が誰かが新しいレコードを作成する場合、それは場所を変更する最初のdivおよび他のレコードに移動します(という持ちたいと思いますどのようにシンプルな画面が表示されます。そのようなことを行うにはいずれかの可能性はありますか? screen

編集:

<div> 
    {% for record in records %} 
     {% if forloop.counter == 1 %} 
      <img src={{ record.image.url}}/> 
      <div> 
       {{record.name}} 
      </div> 
     {% endif %} 
    {% endfor %} 
</div> 

<div> 
    {% for record in records %} 
     {% if forloop.counter == 2 %} 
      <img src={{ record.image.url}}/> 
      <div> 
       {{record.name}} 
      </div> 
     {% endif %} 
    {% endfor %} 
</div> 


     . 
     . 
     # till your 5th image 

答えて

0

あなたは反復数を取得し、反復がループが何であるかをチェックし、それに応じてデータを処理するためにforloop.counterを使用することができます

また、あなたが私たちのことができます。 e CSSを使用して、必要に応じてレイアウトを動作させます。

Hereは、Djangoのテンプレートカウンタの情報である

編集:

{% for record in records %} 
    <div> 
    {% if forloop.counter == 1 %} 

    # Here you can get your first images 

     <img src={{ record.image.url}}/> 
     <div> 
      {{record.name}} 
     </div> 

    {% endif %} 
    </div> 
    <div> 
    {% if forloop.counter == 2 %} 

    # Here you can get your first images 

     <img src={{ record.image.url}}/> 
     <div> 
      {{record.name}} 
     </div> 

    {% endif %} 
    </div> 
    . 
    . 
    # till your 5th image 


{% endfor %} 
+0

こんにちは、ご回答ありがとうございました。私はあなたのソリューションを使用してdivを繰り返したので、それぞれのforloop.counterで5つの新しいdivを作成しました。次に私は 'for-endfor'をdivに入れてみましたが、このレコードは欲しかったですが、大丈夫ですが、反復するたびに 'for-endfor'を開始するのは良い方法だと思いますか?私は最初の投稿に私の作業用のソリューションを貼り付けました。もしそれが動作していて、あなたがチェックできれば、私はdjangoとpythonの標準で大丈夫ですか? – znawca

+0

私はオリジナルの答えを編集しましたが、多くのforループが必要ないと思っています。単一のものを使って同じことを達成することができます。 – kt14

0

これには2つの方法があります。あなたは、単一のビューのために、このオプションを設定する場合: - で降順につながるORDER_BY(「作成」)は一方で(「作成」)

def all_records(request): 
    records = Record.objects.all().order_by('-created') 
    return render(request, 'mycar/allrecords.html', {'records' : records}) 

をあなたがしている、ほぼ正しいが、ORDER_BYはascedingに秩序をリードあなたが必要とするもの。

また、この設定をすべてのビューに適用する場合は、models.pyにclass Metaを設定します。これにより、Record.objects.all()を使用する場所であれば、作成されたフィールドの降順:

class Record(models.Model): 
    name = models.ForeignKey(Car) 
    image = models.ImageField(upload_to='images/') 
    created = models.DateTimeField(
      default=timezone.now) 

    class Meta: 
     ordering = ('-created') 

これは、モデルとビュー内のすべての論理決定を下すとばかりテンプレートでフォーマットされたデータをプラグインするためにDjangoのデザインパターンです。複雑なロジックをテンプレートに追加しないでください。

+0

質問が注文に関するものなら、私はこの答えに同意します。第1の画像と第3の画像(新しい行)ごとに異なる。 – LisaD

0

質問は、モデルに5つ以上のレコードがある可能性があると仮定しています。その場合は、より一般的な解決策は

<div class='row'> 
    <div class='firstimage'> 
     <img src={{ records[0].image.url}}/> 
     {{record.name}} 
    </div> 
    {% for record in records %} 
     {% if forloop.counter > 1 %} 
      <div class='subsequentimage'> 
       <img src={{ record.image.url}}/> 
       {{record.name}} 
      </div> 
     {% endif %} 
     {% cycle "" "</div><div class='row'>" "" %} 
    {% endfor %} 
</div> 

注すべての第3のセルのdiv divの新しい行を開始する「サイクル」タグを使用することであろう。

あなたのCSSクラスが行とセルを区別するためにわからないので、「行」、「firstimage」(2倍の幅を占めるように定義されている可能性があります)、「後続イメージ」を例クラスとして使用しました。

0

私はコンテキスト変数を使用することをお勧めいたします:テンプレートで

def all_records(request): 
    records = Record.objects.all().order_by('-created') 
    newest = records[:5] 
    oldest = records[5:] 
    return render(request, 'mycar/allrecords.html', {'newst' : newest, 
                'oldest': oldest }) 

{% for new in newst %} 
<div>what you want with news</div> 
{% endfor %} 

{% for old in oldest %} 
<div>what you want with olds</div> 
{% endfor %} 
関連する問題