Python 使用模型按标题显示Django上一个和下一个对象
我想根据标题显示上一课和下一课的链接。我试图在我的模型中使用Python 使用模型按标题显示Django上一个和下一个对象,python,django,django-models,django-templates,Python,Django,Django Models,Django Templates,我想根据标题显示上一课和下一课的链接。我试图在我的模型中使用get\u next\u by\u title来实现这一点 如果有更简单的方法,或者有使用自定义get\u next\u或\u prev\u by\u字段的官方文档,请为我指出正确的方向 使用Django 1.6 这是我的模特 class Lesson(models.Model): tutorials = models.ForeignKey('Tutorial', blank=True) title = models.C
get\u next\u by\u title
来实现这一点
如果有更简单的方法,或者有使用自定义get\u next\u或\u prev\u by\u字段的官方文档,请为我指出正确的方向
使用Django 1.6
这是我的模特
class Lesson(models.Model):
tutorials = models.ForeignKey('Tutorial', blank=True)
title = models.CharField(max_length=65)
slug = models.SlugField(unique=True)
def __unicode__(self, ):
return self.title
class Meta:
ordering = 'title',
def get_absolute_url(self):
return reverse('lesson', args=[str(self.slug)])
def get_next_by_title(self):
try:
return self._get_next_or_previous_by_FIELD('title', is_next=True)
except Lesson.DoesNotExist:
return None
def get_previous_by_title(self):
try:
return self._get_next_or_previous_by_FIELD('title', is_next=False)
except Lesson.DoesNotExist:
return None
这是我的模板
{% with prev_lesson=lesson.get_previous_by_title %}
{% if prev_lesson %}
<a class="col-md-6" href="{{ prev_lesson.get_absolute_url }}">« {{ prev_lesson.title }}</a>
<div class="col-md-6"></div>
{% endif %} {% endwith %} {% with next_lesson=lesson.get_next_by_title %}
{% if next_lesson %}
<a class="col-md-6" href="{{ next_lesson.get_absolute_url }}">« {{ next_lesson.title }}</a>
{% endif %} {% endwith %}
{%with prev_lesson=lesson.get_previous_by_title%}
{%if上一课%}
{%endif%}{%endwith%}{%with next_lesson=lesson.get_next_by_title%}
{%if下一课%}
{%endif%}{%endwith%}
这是请求的完整回溯
Environment:
Request Method: GET
Request URL: /tutorials/lesson/lesson-name/
Django Version: 1.6.2
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
'ckeditor',
'tutorials')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware')
Template error:
In template C:\Users\Shaun\Desktop\sg\static\templates\tutorials\lesson.html, error at line 22
'str' object has no attribute 'attname'
12 : {% endif %}
13 : {% if lesson.get_next_by_timestamp %}
14 : <a class="right" href="{{ lesson.get_next_post.get_absolute_url }}">{{ lesson.get_next_post.title|truncatewords:'4' }} »</a>
15 : {% endif %}
16 :
17 : <div class='clearfix'></div>
18 :
19 : <h2>{{ lesson.title|upper }}</h2>
20 : <p>{{ lesson.content|safe }}</p>
21 :
22 : <a class="col-md-6" href=" {{ lesson.get_previous_by_title.get_absolute_url }} " title="{% trans "View previous post" %}">« {{ lesson.get_previous_by_title.title }}</a>
23 : <a class="col-md-6" href="{{ lesson.get_next_by_title.get_absolute_url }}" title="{% trans "View previous post" %}">« {{ lesson.get_next_by_title.title }}</a>
24 :
25 : {% endblock %}
Traceback:
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\core\handlers\base.py" in get_response
114. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Shaun\Desktop\sg\src\tutorials\views.py" in single_lesson
13. return render_to_response('tutorials/lesson.html', locals(), context_instance=RequestContext(request))
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\shortcuts\__init__.py" in render_to_response
29. return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\template\loader.py" in render_to_string
169. return t.render(context_instance)
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\template\base.py" in render
140. return self._render(context)
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\template\base.py" in _render
134. return self.nodelist.render(context)
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\template\base.py" in render
840. bit = self.render_node(node, context)
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\template\debug.py" in render_node
78. return node.render(context)
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\template\loader_tags.py" in render
123. return compiled_parent._render(context)
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\template\base.py" in _render
134. return self.nodelist.render(context)
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\template\base.py" in render
840. bit = self.render_node(node, context)
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\template\debug.py" in render_node
78. return node.render(context)
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\template\loader_tags.py" in render
62. result = block.nodelist.render(context)
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\template\base.py" in render
840. bit = self.render_node(node, context)
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\template\debug.py" in render_node
78. return node.render(context)
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\template\debug.py" in render
88. output = self.filter_expression.resolve(context)
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\template\base.py" in resolve
585. obj = self.var.resolve(context)
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\template\base.py" in resolve
735. value = self._resolve_lookup(context)
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\template\base.py" in _resolve_lookup
789. current = current()
File "C:\Users\Shaun\Desktop\sg\src\tutorials\models.py" in get_previous_by_title
64. return self._get_next_or_previous_by_FIELD('title', is_next=False)
File "C:\Users\Shaun\Desktop\sg\lib\site-packages\django\db\models\base.py" in _get_next_or_previous_by_FIELD
708. param = force_text(getattr(self, field.attname))
Exception Type: AttributeError at /tutorials/lesson/setting-up-your-django-blog-application/
Exception Value: 'str' object has no attribute 'attname'
环境:
请求方法:获取
请求URL:/教程/课程/课程名称/
Django版本:1.6.2
Python版本:2.7.6
已安装的应用程序:
(“django.contrib.admin”,
“django.contrib.auth”,
“django.contrib.contenttypes”,
“django.contrib.sessions”,
“django.contrib.messages”,
“django.contrib.staticfiles”,
“博客”,
“编辑”,
“教程”)
已安装的中间件:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
“django.middleware.csrf.CsrfViewMiddleware”,
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.xframeoptions中间件')
模板错误:
在模板C:\Users\Shaun\Desktop\sg\static\templates\tutorials\lesson.html中,第22行出现错误
“str”对象没有属性“attname”
12:{%endif%}
13:{%if lesson.get_next_by_timestamp%}
14 :
15:{%endif%}
16 :
17 :
18 :
19:{{课程名称|上}}
20:{{lesson.content | safe}
21 :
22 :
23 :
24 :
25:{%endblock%}
回溯:
get\U响应中的文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\core\handlers\base.py”
114响应=包装的回调(请求,*回调参数,**回调参数)
单个课程中的文件“C:\Users\Shaun\Desktop\sg\src\tutorials\views.py”
13返回render_to_response('tutorials/lesson.html',locals(),context_instance=RequestContext(request))
render\u to\u响应中的文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\shortcuts\\uuuu init\uuuuu.py”
29返回HttpResponse(loader.render_to_string(*args,**kwargs),**HttpResponse_kwargs)
文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\template\loader.py”,位于render\u to\u字符串中
169返回t.render(上下文\实例)
render中的文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\template\base.py”
140返回self.\u呈现(上下文)
文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\template\base.py”位于\u render中
134返回self.nodelist.render(上下文)
render中的文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\template\base.py”
840bit=self.render_节点(节点,上下文)
render\u节点中的文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\template\debug.py”
78返回node.render(上下文)
render中的文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\template\loader\u tags.py”
123返回编译的\u父对象。\u呈现(上下文)
文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\template\base.py”位于\u render中
134返回self.nodelist.render(上下文)
render中的文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\template\base.py”
840bit=self.render_节点(节点,上下文)
render\u节点中的文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\template\debug.py”
78返回node.render(上下文)
render中的文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\template\loader\u tags.py”
62结果=block.nodelist.render(上下文)
render中的文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\template\base.py”
840bit=self.render_节点(节点,上下文)
render\u节点中的文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\template\debug.py”
78返回node.render(上下文)
render中的文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\template\debug.py”
88输出=self.filter\u expression.resolve(上下文)
文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\template\base.py”
585obj=self.var.resolve(上下文)
文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\template\base.py”
735value=self.\u解析\u查找(上下文)
文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\template\base.py”位于\u resolve\u lookup中
789电流=电流()
文件“C:\Users\Shaun\Desktop\sg\src\tutorials\models.py”位于get\u previous\u by\u标题中
64返回self.\u获取\u下一个\u或\u上一个\u按\u字段('title',is\u next=False)
文件“C:\Users\Shaun\Desktop\sg\lib\site packages\django\db\models\base.py”位于\u get\u next\u或\u previous\u by\u字段中
708param=force_text(getattr(self,field.attname))
异常类型:AttributeError at/tutorials/lesson/设置django博客应用程序/
异常值:“str”对象没有属性“attname”
Django datetime字段仅添加get\u previous\u by
。如果要按标题排序,则必须创建自己的方法。它没有显示任何内容,因为Django模板系统以静默方式失败
Django模型类有一个\u get\u next\u或\u previous\u by\u字段
,您可以创建以下内容:
class MyModel(models.Model):
[fields]
def get_next_by_title(self):
try:
return self._get_next_or_previous_by_FIELD('title', is_next=True)
except MyModel.DoesNotExist:
return None
def get_previous_by_title(self):
try:
return self._get_next_or_previous_by_FIELD('title', is_next=False)
except MyModel.DoesNotExist:
return None
模板:
<a class="col-md-6" href="{{ lesson.get_previous_by_title.get_absolute_url }}" title="{% trans "View previous post" %}">« {{ lesson.get_previous_by_title.title }}</a>
<a class="col-md-6" href="{{ lesson.get_next_by_title.get_absolute_url }}" title="{% trans "View previous post" %}">« {{ lesson.get_next_by_title.title }}</a>
谢谢您的帮助,但我仍然无法将其显示出来。我将代码更新为现在的代码,你能看一下吗?你不明白,你不必用标题替换字段。在这种情况下,方法实际上被命名为\u get\u next\u或\u previous\u by\u FIELD
:)我在想lol,我修好了。。再次更新模型和模板