0

Entryデータベース Entries があり、現在の項目をtemplate に表示したいと考えていますentry.html。次に、サイドバーに前のエントリ (存在する場合) と次のエントリ (存在する場合) へのリンクを表示します。これは私の現在のviews.pyです:

def entry(request, projects_id=1, entries_id=1):
    entries_list = Entries.objects.filter(project_id=projects_id)
    paginator = Paginator(entries_list, 1)

    page = request.GET.get('page')
    try:
        all_entries = paginator.page(page)
    except PageNotAnInteger:
        all_entries = paginator.page(1)
    except EmptyPage:
        all_entries = paginator.page(paginator.num_pages)
    return render_to_response('entry.html',
                                {'projects': Projects.objects.get(id=projects_id),
                                'entry': Entries.objects.get(project_id=projects_id, entry_unique=entries_id), 
                                'all_entries': all_entries}
                                )

これは、テンプレート内の現在のページネーター呼び出しコードです。

{% if all_entries.has_previous %}
<a href="/projects/get/{{projects.id}}/entries/get/{{entry.entry_unique|add:"-1"}}"><img src="/static/assets/img/arrow_left.png" width="40"></a>
{% endif %}
{% if all_entries.has_next %}
<a href="/projects/get/{{projects.id}}/entries/get/{{entry.entry_unique|add:"1"}}"><img src="/static/assets/img/arrow_right.png" width="40"></a>
{% endif %}

現在の問題は、右矢印のみが表示され、左矢印は表示されず、現在のエントリの後にエントリがあるかどうかに基づいていないことです。entry_unique と id フィールドがエントリごとに異なるように設定しました。エントリがサイト全体ではなく、プロジェクトごとに 1 ずつ増加するようにするためです。

これはエントリの私のモデルです:

class Entries(models.Model):
    project_id = models.ForeignKey(Projects)
    entry_unique = models.IntegerField(default=0)
    entry_pubdate = models.DateTimeField('date published')

したがって、私の主な問題は、エントリ テーブルにはid列がありますが、project_idどのプロジェクトがエントリを所有しているかを判断する方法であり、entry_uniqueエントリ 1 が 1、エントリ 2 が 2 になるように、プロジェクトごとに 1 つずつ増加しidます。は。

ただし、paginator を使用すると、previous_entry 矢印は表示されず、next_entry 矢印のみが表示されます。これは、別の entry_unique があるかどうかとは関係ありません。つまり、基本的には project_id で並べ替えて、作業しているエントリを特定していますが、それらのエントリを entry_unique で操作する必要があります。

編集: 最後になりましたが、has_next は、より高い別の project_id がある場合にのみ true を返すように見えます。そのため、番号が最も大きいプロジェクトに移動すると、has_next は false を返し、右矢印は表示されません。しかし、まだ has_previous をまったく機能させることができません。

4

2 に答える 2

1

わかりました Views.py を変更することで、なんとか動作させることができました:

def entry(request, projects_id=1, entries_id=1):
    current_entry = Entries.objects.get(project_id=projects_id, entry_unique=entries_id)
    current_entry_unique = current_entry.entry_unique
    entry_previous = current_entry_unique
    entry_previous -= 1
    if Entries.objects.filter(project_id=projects_id, entry_unique=entry_previous).exists():
        prev_entry = Entries.objects.get(project_id=projects_id, entry_unique=entry_previous)
    else:
        prev_entry = None
    entry_next = current_entry.entry_unique
    entry_next += 1
    if Entries.objects.filter(project_id=projects_id, entry_unique=entry_next).exists():
        next_entry = Entries.objects.get(project_id=projects_id, entry_unique=entry_next)
    else:
        next_entry = None
    return render_to_response('entry.html',
                                {'projects': Projects.objects.get(id=projects_id),
                                'entry': Entries.objects.get(project_id=projects_id, entry_unique=entries_id),
                                'prev_entry': prev_entry,
                                'next_entry': next_entry }
                                )

そして、私の entry.html は次のようになります。

{% if prev_entry %}
<a href="/projects/get/{{projects.id}}/entries/get/{{entry.entry_unique|add:"-1"}}"><img src="/static/assets/img/arrow_left.png" width="40"></a>
{% endif %}
{% if next_entry %}
<a href="/projects/get/{{projects.id}}/entries/get/{{entry.entry_unique|add:"1"}}"><img src="/static/assets/img/arrow_right.png" width="40"></a>
{% endif %}

きれいではないかもしれませんが、私がやりたいことをやっています。ただし、よりうまく機能させる方法があるかもしれません。

于 2013-07-30T15:21:05.983 に答える
0

ページネーターなし:

def entry(request, projects_id, entries_id):

    entries_in_project = Entries.objects.filter(project_id=projects_id)
    entry = get_object_or_404(entries_in_project, entry_unique=entries_id)
    try:
        prev_entry_id = entries_in_project.filter(entry_unique__lt=entries_id)
            .order_by('-entry_unique').values('entry_unique')[:1][0]['entry_unique']
    except IndexError:
        prev_entry_id = None
    try:
        next_entry_id = entries_in_project.filter(entry_unique__gt=entries_id)
            .order_by('entry_unique').values('entry_unique')[:1][0]['entry_unique']
    except IndexError:
        next_entry_id = None

    return render_to_response('entry.html',{
        'projects': Projects.objects.get(id=projects_id), 'entry': entry,
        'next_entry_id': next_entry_id, 'prev_entry_id': prev_entry_id,
    })

より良い方法:

これらはすべて、組み込み機能に置き換えることができます。

https://docs.djangoproject.com/en/dev/ref/models/options/#order-with-respect-to

class Entries(models.Model):
    project_id = models.ForeignKey(Projects)
    entry_pubdate = models.DateTimeField('date published')

    class Meta:
        order_with_respect_to = 'project_id'

def entry(request, projects_id, entries_id):

    entry = get_object_or_404(Entries,project_id=projects_id, id=entries_id)

    next_entry = entry.get_next_in_order()
    prev_entry = entry.get_previous_in_order()

    return render_to_response('entry.html',{
        'projects': Projects.objects.get(id=projects_id), 'entry': entry,
        'next_entry': next_entry, 'prev_entry': prev_entry,
    })

entry.html で:

{% if next_entry %}<a href="{{ next_entry.get_absolute_url }}">Next</a>{% endif %}
{% if prev_entry %}<a href="{{ prev_entry.get_absolute_url }}">Previous</a>{% endif %}
于 2013-07-30T08:16:19.270 に答える