我正在尝试弄清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匹配和链接如何工作。可以根据我的例子来解释一下吗?
您认为有两个问题:
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。
在我潜水之前,让我们同意一个鼻涕虫只是一个花哨的名字,它只是一个字符串而已。
确定,所以您想了解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相同,只是呈现它!