Django模板URL匹配的工作原理

问题描述 投票:0回答:2

我正在尝试弄清django模板中的url匹配如何工作。我要实现的目标是,单击链接时将显示一个特定的对象。

Models.py

class PostManager(models.Manager):
    def get_queryset(self):
        return super(PostManager,self).get_queryset().filter(status='published')

class Post(models.Model):
    STATUS_CHOICES = (('published','Published'),
                        ('draft','Draft '))
    FIELD_CHOICES = (('1','1 Title and body field'),
                    ('2','2 Title and body fields'),
                    ('3','3 Title and body fields'),
                    ('4', '4 Title and body fields'),
                    ('5', '5 Title and body fields'))

    author = models.ForeignKey(User,
                                on_delete=models.CASCADE,
                                related_name='blog_post')


    title = models.CharField(max_length=100)
    sub_title = models.TextField(max_length=50,default="")

    title_1 = models.CharField(max_length=100,null=True,blank=True)
    title_1_body = models.TextField(null=True,blank=True)


    title_2 = models.CharField(max_length=100,null=True,blank=True)
    title_2_body = models.TextField(null=True,blank=True)


    title_3 = models.CharField(max_length=100,null=True,blank=True)
    title_3_body = models.TextField(null=True,blank=True)



    title_4 = models.CharField(max_length=100,null=True,blank=True)
    title_4_body = models.TextField(null=True,blank=True)


    title_5 = models.CharField(max_length=100,null=True,blank=True)
    title_5_body = models.TextField(null=True,blank=True)

    created = models.DateField()
    publish = models.DateTimeField(default=timezone.now)
    slug = models.SlugField(max_length=250,
                            unique_for_date='created')

    status = models.CharField(max_length=250,
                    choices=STATUS_CHOICES,
                    default='draft')


    object = models.Manager()
    postManager = PostManager()


    class Meta():
        ordering = ('publish',)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post_detail',
                        args=[self.slug])

def get_image_filename(instance, filename):
    title = Post.title
    slug = slugify(title)
    return "media/%s-%s" % (slug, filename)


class Image(models.Model):
    post = models.ForeignKey(Post,
                            on_delete=models.CASCADE,
                            related_name='images')

    image_1 = models.ImageField(upload_to=get_image_filename,default='123.jpg',verbose_name="Image",null=True)
    image_2 = models.ImageField(upload_to=get_image_filename,default='123.jpg',verbose_name="Image",null=True)
    image_3 = models.ImageField(upload_to=get_image_filename,default='123.jpg',verbose_name="Image",null=True)
    image_4 = models.ImageField(upload_to=get_image_filename,default='123.jpg',verbose_name="Image",null=True)
    image_5 = models.ImageField(upload_to=get_image_filename,default='123.jpg',verbose_name="Image",null=True)

views.py

def post_detail(request):
    post = get_object_or_404(Post)
    return render(request, 'blog_application/templates/single.html',
                            {'post':post})

index.html

{% for elem in posts %}

                <p class="mb-md-5">A small river named Duden flows by their place and supplies it with the necessary regelialia</p>
                    <p><a href="{ url elem.get_absolute_url }" class="btn btn-black px-3 px-md-4 py-3">Read More <span class="icon-arrow_forward ml-lg-4"></span></a></p>

            {% endfor %}

urls.py

path('post_detail/<slug:slug>',views.post_detail,name='single'),
path('', views.show_index, name='index'),

我不太了解模板的url匹配和链接如何工作。可以根据我的例子来解释一下吗?

django django-urls
2个回答
0
投票

您认为有两个问题:

def post_detail(request, slug):
    post = get_object_or_404(Post, slug=slug)
    return render(request, 'blog_application/templates/single.html',
                            {'post':post})

更一般而言,您从URL接收slug值,并将其与参数一起传递给视图。

此外,您需要将参数传递给get_object_or_404参见this


0
投票

在我潜水之前,让我们同意一个鼻涕虫只是一个花哨的名字,它只是一个字符串而已。

确定,所以您想了解Django URL的工作原理。 请退回plz

  • 首先让我们了解URL的工作原理,假设我将打开此网站www.example.com并按原样打开它,该网站会正确打开吗?您希望主页在那里

  • 现在,让我们将其打开为www.example.com?text=welcome

按chrome中的F12并切换到“网络”标签,实际上发生的是,您在网络标签的最底部添加了一个在chrome中显示为“查询字符串参数”的参数,这表示您希望通过包含字符串hello的称为文本的参数

Ok,现在与问题之间有什么关系?请忍受我]

想象一下,我有一个带有帖子的社交网站,并且我想为每个帖子创建一个代码“ slug”,以便当在URL中将其键入为参数时,它会获取该特定帖子

现在,这是您的urlpatterns.py

path('post_detail/<slug:slug>', views.post_detail, name='single'),
path('', views.show_index, name='index'),

为了简单起见,我假设这是项目级别的urls.py。

用户访问该网站时没有任何URL参数或子页面,它只是呼叫您的views.show_index

现在用户访问了您的website/post_detail/,所发生的情况是看urlpattern中是否有与此匹配的urlpattern,但是没有,因此只是404

现在用户访问您的website/post_detail/ANY_RANDOM_TEXT

发生的情况是实际上有一个与website/post_detail/ANY_RANDOM_TEXT匹配的urlpattern其中path('post_detail/<slug:slug>', views.post_detail, name='single')

因此,“ ANY_RANDOM_TEXT”必须是子弹,然后让我们将其作为子弹!

现在我们有了子弹,并且urlpattern将调用views.post_detail(函数或视图)并将该子弹传递给它,所以我们必须接受它吗?

def post_detail(request, slug):
    post = get_object_or_404(Post, slug=slug)
    return render(request, 'blog_application/templates/single.html',
                            {'post':post})

现在您可以访问“ slug”,它只是“ ANY_RANDOM_TEXT”,因为我们匹配了它,现在获得带有slug的帖子,该帖子与url中的slug相同,只是呈现它!

© www.soinside.com 2019 - 2024. All rights reserved.