Job Search Engine


838 浏览 5 years, 8 months

2.3 详情视图

版权声明: 转载请注明出处 http://www.codingsoho.com/

template_name

列表往往不能显示全部的信息,这一节我们来完成DetailView,针对某一条目进行详细展示

继承详情视图
from django.views.generic.detail import DetailView
class JobEntryDetailView(DetailView):
    model = JobEntry    
增加新的路由
from job_entry.views import JobEntryListView, JobEntryDetailView
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^jobentry/$', JobEntryListView.as_view(), name='job_entry_list'),
    url(r'^jobentry/(?P<pk>\d+)/$', JobEntryDetailView.as_view(), name='job_entry_detail'),
]

正则表达式可参考文档Django URL正则表达式

模板

创建新的模板文件jobentry_detail.html,系统相对路径为jobentry/jobentry_detail.html

传递过去的context变量,关于当前对象的变量是object

简单实现代码如下

<table>
    <tr>
        <th>title</th>
        <th>salary</th>
        <th>region</th>
        <th>degree</th>
        <th>experience</th>
        <th>company</th>
        <th>industry</th>
        <th>description</th>
        <th>href</th>
        <th>created</th>
    </tr>
    <tr>
        <td>{{object.title}}</td>
        <td>{{object.salary}}</td>
        <td>{{object.region}}</td>
        <td>{{object.degree}}</td>
        <td>{{object.experience}}</td>
        <td>{{object.company}}</td>
        <td>{{object.industry}}</td>
        <td>{{object.description}}</td>
        <td>{{object.href}}</td>
        <td>{{object.created}}</td>
    </tr>
</table>

访问http://127.0.0.1:8000/jobentry/1/可以显示详情视图

高级路由访问

实际操作中我们不会直接输入指定对象的pk id来访问,往往是通过在列表视图点击超链接调整过去,在django中可以这样实现

方法1 : 通过固定url访问

<td><a href="/jobentry/{{obj.id}}">{{obj.title}}</a> </td>

方法2: 通过url name

<td><a href="{% url 'job_entry_list' %}{{obj.id}}">{{obj.title}}</a> </td>

使用url功能时,需要先加载下面templatetag

{% load staticfiles %}

方法3: 通过后台函数get_absolute_url

在model里添加函数

from django.core.urlresolvers import reverse

class JobEntry(models.Model):
    def get_absolute_url(self):
        return reverse("job_entry_detail", kwargs={"pk": self.id})  

其中,job_entry_detailpk分别在urls.py中指定了,前者是name,后者是网址中的参数。这两个地方需要成对修改

url(r'^jobentry/(?P<pk>\d+)/$', JobEntryDetailView.as_view(), name='job_entry_detail'),