我的项目是博客类型。在此博客中,我需要发布新闻。我可以使用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等)。
答案 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 %}
。
祝你好运!