我有一个数据库,条目,我想让当前Entry
中的项目显示在模板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
每个条目增加一个id
项目使条目1为1,条目2为2,无论{{1}}列是什么。
然而,当使用paginator时,它不会向我显示previous_entry箭头,只显示next_entry箭头,并且与是否还有另一个entry_unique没有任何关系。所以本质上我是按project_id排序来确定我正在使用哪些条目,但我需要通过entry_unique来操作这些条目。
编辑:最后但并非最不重要的是,如果另一个project_id更高,看起来has_next只返回true,所以如果我进入编号最高的项目,那么has_next返回false并且它不会显示右箭头。但我仍然无法完成任何工作。
答案 0 :(得分: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 %}
它可能并不漂亮,但它正在做我想做的事情。但是,可能有一些方法可以让它更好地工作。
答案 1 :(得分:0)
没有Paginator:
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 %}