django 1.8 <a href="{% url " post_detail"="" pk="post.pk" %}"="">{{ post.title }}</a>做了什么

时间:2015-09-08 06:01:47

标签: django django-models django-templates

我从djangogirls

学习django

在扩展名为“blog”的应用程序时,我无法理解下面代码块的作用。我用谷歌搜索但找不到相关的例子。 我有一个名为 post_list.html 的模板文件,它扩展了 base.html ,看起来像

{% extends "blog/base.html" %}

{% block content %}
    {% for post in posts %}
        <div class="post">
            <div class="date">
                {{ post.published_date }}
            </div>
        <h1><a href="{% url "post_detail" pk=post.pk %}">{{ post.title }}</a></h1>   #confused part here ??

        <p>{{ post.text|linebreaks }}</p>
    </div>
    {% endfor %}
{% endblock content %}


i dont have post.pk in any model and dont know how it is assigned to "pk"   variable

<h1><a href="{% url "post_detail" pk=post.pk %}">{{ post.title }}</a> 

</h1> 

以下是应用网址和模型的外观

#models.py
from django.db import models
from django.utils import timezone

class Post(models.Model):
    author = models.ForeignKey('auth.User')
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

def publish(self):
    self.published_date = timezone.now()
    self.save()

def __str__(self):
    return self.title



#views.py
from django.shortcuts import render, get_object_or_404
from django.utils import timezone
from .models import Post
def post_list(request):
    posts =     Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
return render(request, 'blog/post_list.html', {'posts': posts})    

def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    return render(request, 'blog/post_detail.html', {'post': post})

#urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.post_list, name='post_list'),
url(r'^post/(?P<pk>[0-9]+)/$', views.post_detail, name='post_detail'),
]

谢谢

1 个答案:

答案 0 :(得分:3)

默认情况下,所有django模型都会获得一个名为id的主键;即使您未在models.py中指定一个。

.pk是由django分配的每个模型的automatic generated property,它指的是主键。

使用.pk的原因是因为无论实际主键字段是什么,它都将始终返回主键值。因此,如果您决定拥有一个拥有自己主键的模型(因此,django不会为您创建一个),.pk仍然有效。