如何在Django中创建唯一的URL?

时间:2018-11-07 17:48:41

标签: python django

我的项目是博客类型。在此博客中,我需要发布新闻。我可以使用Django管理页面添加新闻,并在一个url中显示所有新闻。现在,我希望每个新闻都有一个唯一的URL。

我的models.py

from django.db import models

class Newsform(models.Model):
    headline = models.CharField(max_length=50)
    description = models.CharField(max_length=100, default='')
    content = models.CharField(max_length=100, default='')
    image = models.ImageField(upload_to='news_image', blank=True)

views.py

from django.shortcuts import render
from blog.models import Newsform

def show_content_from_database(request):
    headline_news=Newsform.objects.all()
    context = {
        'headline_news': headline_news
    }
    return render(request, 'blog/index.html', context)

这里是urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.show_content_from_database, 
name='show_content_from_database'),
]

最后,是index.html的一部分,我在其中显示每个新闻的标题:

{% for headline in headline_news %}
  <h1>{{ headline.headline }}</h1>
{% endfor %}

充其量,我想在此处发布指向新闻的唯一链接:<h1>{{ headline.headline }}</h1>,并且该唯一页面必须扩展一些base.html

我已经在互联网上搜索了问题的解决方案,但没有找到。该任务可能足够大,所以我想在互联网上看到一些示例的链接(youtube,stackoverflow或github等)。

2 个答案:

答案 0 :(得分:1)

views.py中定义一个函数,该函数将从接收的主键中获取一个对象。

def show_one_item(request, pk):
    headline_news = Newsform.objects.get(pk=pk) # returns only one object
    context = {
        'headline_news': headline_news
    }
    return render(request, 'blog/new_template.html', context) # Write a new template to view your news.

将此添加到您的urls.py

urlpatterns = [
    path('', views.show_content_from_database, name='show_content_from_database'), 
    path('news/<pk:pk>', show_one_item, name="show_one_item")
]

一旦您编写了new_template以适合该功能。每个新闻项都有唯一的网址。

您的new_template.html的示例可能像这样。

{% extends 'base.html' %}
<div class="container">

    <p>{{ headline_news.headline }}</p>
    <p>{{ headline_news.description }}</p>
    <p>{{ headline_news.content }}</p>

</div>

现在,您可以转到../news/1(假设您没有弄乱django的默认行为)来查看您的第一个新闻。 ../news/2进行第二次操作,以此类推...以后再学习如何使用slugs来使您的网址看起来更逼真。

答案 1 :(得分:1)

由于您正在编写博客应用程序,因此使用a作为唯一标识符很酷。 “子代码”是URL的一部分,它通常根据页面标题使用人类可读的关键字标识页面。您可以查看此博客文章sigsegv, segfaults etc... are an implementation defined behavior

这里是使用您的可用代码的快速解释

您的Models.py

from django.db import models

class Newsform(models.Model):
    headline = models.CharField(max_length=50)
    slug = models.SlugField(unique=True)
    description = models.CharField(max_length=100, default='')
    content = models.CharField(max_length=100, default='')
    image = models.ImageField(upload_to='news_image', blank=True)

Views.py

from django.shortcuts import render, get_object_or_404
from blog.models import Newsform

def show_content_from_database(request, slug):
    headline_news= get_object_or_404(Newsform, slug=slug)
    context = {
        'headline_news': headline_news
    }
    return render(request, 'blog/index.html', context)

Urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('blog/<slug:slug>', views.show_content_from_database, 
name='show_content_from_database'),
]

您的Template.html

{% extends 'base.html' %}
    <p>{{ headline_news.headline }}</p>
{% endblock %}

由于您获得了特定的博客页面,因此无需使用此{% for headline in headline_news %}

祝你好运!