python网站开发模板,python网站模板下载

本篇文章给大家谈谈python网站开发模板,以及python网站模板下载,希望对各位有所帮助,不要忘了收藏本站喔。

前期准备

1. 请看我的Django基础文章,用Django写出最简单的网页。可以带着大家从无到有,写出一个含有"Hello, world!"的基本网页不会c语言直接学python。最基础的下载等基本操作都在这篇文章了,本系列文章属于更“高级”一点,所以不会再花时间在这方面了。

3. How to tango with Django 1.7。这是一本英文写的手把手教你使用Django的好书,旧版本是online免费的,新版本都需要付费。本系列文章就是根据这本书提供的步骤所写,因为1.7版本很老旧,我也费了很大的功夫更新了一番。大家要是有时间,也推荐好好翻阅一下这本书。

4. django 官网。大家要是还有更多空闲时间想继续深入了解,官网必不可少。

本文目标

现在通过本系列的第一,二篇文章,我们已经建立了模型并在其中填充了数据。本文作为本系列的第三篇文章,目的就是让我们学会可以把东西放在一起。我们将研究如何从视图(views) 中的模型(model) 访问数据,以及如何通过模板(template) 显示这些数据。

写在文前

要想在Django 中创建数据驱动(data driven) 的页面,您必须执行以下五个主要步骤。

1. 将希望使用的模型导入到应用程序的views.py 文件中。

2. 在我们希望使用的视图view 中,做到能够查询模型以获得我们想要呈现的数据。

3. 将模型的结果传递到模板中。

4. 设置模板,以我们希望的方式将数据呈现给用户。

5. 将URL映射到我们的视图。

这些步骤显示了Django 框架是如何将模型、视图和模板三者之间的关注点分离的。

1. 在Rango的主页上显示类别

关于主页面的一个主要的要求就是可以显示我们程序的前五个类别。

1.1 导入需要的模型

为了满足这一要求,我们将进行上述每一个步骤。首先,打开eva/views.py 并从eva 的models.py 文件中导入类别(category) 模型。在views.py 文件中输入下面这段。

# Import the Category model

from eva.models import Category

1.2 修改index 程序

首先,我们要做的是修改views.py 文件中的index() 函数。如果我们还记得本系列前两篇文章的大致内容,我们应该还能记住index() 函数是负责主页面的视图。修改这个函数,使其看起来像下面的示例。

def index(request):

# Query the database for a list of ALL categories currently stored.

# Order the categories by no. likes in descending order.

# Retrieve the top 5 only - or all if less than 5.

# Place the list in our context_dict dictionary which will be passed to the template engine.

category_list = Category.objects.order_by('-likes')[:5]

context_dict = {'categories': category_list}

# Render the response and send it back!

return render(request, 'rango/index.html', context_dict)

这里我引用的是rango, 因为在我的templates 文件夹里为了致敬英文版的教程介绍,在给存放html 网页的地方取了和它一致的名字。大家当然可以取别的名字,只是别忘记在这里改过来。

在这里,我们一次性完成了文前所描述的第二步和第三步。

首先,程序中的第一行代码让我们可以查询类别模型以检索前五类。这里我们使用order_by() 的方法按喜欢数的降序来排序。然后我们将这个列表限制为列表中的前5个类别对象。

category_list = Category.objects.order_by('-likes')[:5]

查询完成后,我们将对列表(存储为变量category_list) 的引用传递给字典context_dict。然后,该字典作为render() 调用中模板引擎内容的一部分被传递。

context_dict = {'categories': category_list}

# Render the response and send it back!

return render(request, 'rango/index.html', context_dict)

1.3 修改index.html, models.py 和 admin.py

随着视图的更新,剩下我们要做的就是更新模板rango/index.html 文件,位于项目的模板目录中 /zhou/templates/rango。更改文件的HTML代码,使其看起来类似如下所示的示例。

{% load staticfiles %}

Eva

Eva says...hello world!

{% if categories %}

{% for category in categories %}

{{ category.name - 这个网站可出售。 - 最佳的domains,category branding 来源和相关信息。 }}

{% endfor %}

{% else %}

There are no categories present.

{% endif %}

About

我们还需要在models.py 还有 admin.py文件中,让服务器知道我们添加了views, likes。

在eva/models.py 中修改代码如下所示:

from django.db import models

# Create your models here.

class Category(models.Model):

name = models.CharField(max_length=128, unique=True)

views = models.IntegerField(default=0, unique=False)

likes = models.IntegerField(default=0, unique=False)

def __str__(self):

return self.name

class Page(models.Model):

category = models.ForeignKey(Category, on_delete=models.CASCADE,)

title = models.CharField(max_length=128)

url = models.URLField()

views = models.IntegerField(default=0, unique=False)

likes = models.IntegerField(default=0, unique=False)

def __str__(self):

return self.title

在eva/admin.py 文件中修改如下所示:

from django.contrib import admin

# Register your models here.

from eva.models import Category, Page

class PageAdmin(admin.ModelAdmin):

list_display = ('title', 'category', 'url')

class CatAdmin(admin.ModelAdmin):

list_display = ('views', 'likes')

admin.site.register(Category, CatAdmin)

admin.site.register(Page, PageAdmin)

因为我们添加了新的变量views, likes 在类别中,对模型进行了改动,所以如上篇文章所讲的,我们需要通过特定应用程序makemiations 命令来表示这些更改。

python3 manage.py migrate

# 以下是结果

Operations to perform:

Apply all migrations: admin, auth, contenttypes, eva, sessions

Running migrations:

Applying eva.0002_auto_20180625_2139... OK

现在让我们保存各个文件,进入网页地址:http://127.0.0.1:8880/eva/ ,我们就能看到包含三个类别的网页了,如下图。

2. 创建有细节的页面

根据eva 的要求,我们还需要能够显示与每个类别关联的页面列表。我们需要可以创建一个新的视图,并将其参数化。我们还需要创建URL 模式和URL 字符串来编码类别名。

2.1 URL 设计和映射

首先我们需要考虑URL 的特性。其中一个就是每个URL中的每个类别包含各自唯一的ID。例如,我们可以创建url,比如/eva/category/1/ 或 /eva/category/2/,其中的数字分别对应于id为1和2的类别。然而,这些url 是为机器设计的,不容易被人类理解。尽管我们可以推断这个数字与一个类别有关,但是我们如何知道哪个类别与是id 1或2 呢? 我们必须经过尝试才能知道。

相反,如果我们可以使用类别名称作为URL的一部分,那就明了多了。/eva/category/Python/ 应该是包含了一个与Python类别相关的页面列表。这是一个简单、可读和有意义的URL。

2.2 使用Slug 字段更新类别表

如果我们想要创建整洁的url,我们将在类别模型中包含一个slug 字段。

“鼻涕虫”(slug) 在这里有什么用呢? 我查了下官网,解释是“这是一种短标签,只包含字母、数字、下划线或连字符。它们通常用在url中。”我自己理解就是,可以让你的url 包含关于链接内容的描述性信息,比如说这个url, https://zhou-1.github.io/zhou.github.io/handsome-zhou 这是我自己瞎编的一个网址。。。。后面的handsome-zhou就是说明点击这个链接,会把我们带到一个说我多帅的一个网页,很简洁,很明了,毕竟是事实。(逃。。。。

言归正传,讲我们接下去的步骤,

首先,我们需要从django 中导入函数slugify,它将用连字符i 来代替空白区间。举个例子,这句话“我 如 何 在 django 中 创 建 一 个 slag”变成了“我-如-何-在-django-中-创-建-一-个-slag”(英文原文是:“how do i create a slug in django” turns into “how-do-i-create-a-slug-in-django”我私自把它汉化了,放上原文,大家可以对比感受下)。

然后我们需要重写类别模型的保存方法,我们将该方法称为slugify 并使用它来更新slug 字段。注意,每当类别名称发生变化时,slug 也会发生变化,从而导致链接损坏。我们可以通过只在创建对象时定义slug 来防止这种情况。好,让我们来更新模型,在eva/models.py文件中更新代码如下所示。

from django.template.defaultfilters import slugify

# Create your models here.

class Category(models.Model):

name = models.CharField(max_length=128, unique=True)

views = models.IntegerField(default=0, unique=False)

likes = models.IntegerField(default=0, unique=False)

slug = models.SlugField()

def save(self, *args, **kwargs):

# Uncomment if you don't want the slug to change every time the name changes

#if Domain Name Registration with Privacy & Cheap Price is None:

#self.slug = slugify(self.name)

self.slug = slugify(self.name)

super(Category, self).save(*args, **kwargs)

def __str__(self):

return self.name

现在我们已经对模型执行了更新,但我们仍然需要执行迁移。

python3 manage.py makemigrations eva

#下面是结果和需要输入的信息

You are trying to add a non-nullable field 'slug' to category without a default; we can't do that (the database needs something to populate existing rows).

Please select a fix:

1) Provide a one-off default now (will be set on all existing rows with a null value for this column)

2) Quit, and let me add a default in models.py

Select an option: 1 #这里输入1

Please enter the default value now, as valid Python

The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now

Type 'exit' to exit this prompt

>>> '' #这里输入''

Migrations for 'eva':

eva/migrations/0003_category_slug.py

- Add field slug to category

python3 manage.py migrate

# 下面是结果

Operations to perform:

Apply all migrations: admin, auth, contenttypes, eva, sessions

Running migrations:

Applying eva.0003_category_slug... OK

由于我们没有为slug 提供默认值,并且模型中已有数据,因此迁移命令将在执行makemigrations 后为我们提供两个选项。选择提供默认值的选项1,并输入' ' 。现在重新运行我们的填充脚本。

python3 populate_eva.py

#以下是结果

Starting eva population ...

- Python - Official Python Tutorial

- Python - How to Think like a Computer Scientist

- Python - Learn Python in 10 Minutes

- Django - Official Django Tutorial

- Django - Django Rocks

- Django - How to Tango with Django

- Other Frameworks - Bottle

- Other Frameworks - Flask

由于每个类别都能调用保存方法,因此每次保存将执行覆盖方式来更新slug 字段。运行服务器,并通过管理界面来观察模型中的数据。

在管理界面中,我们希望它能自动预填充slug 字段作为类别名称中的类型。为此,我们需要更新eva/admin.py,代码如下:

from django.contrib import admin

# Register your models here.

from eva.models import Category, Page

class PageAdmin(admin.ModelAdmin):

list_display = ('title', 'category', 'url')

class CatAdmin(admin.ModelAdmin):

list_display = ('name','views', 'likes')

prepopulated_fields = {'slug':('name',)}

admin.site.register(Category, CatAdmin)

admin.site.register(Page, PageAdmin)

现在让我们尝试在管理界面添加一个新的类别。Awesome! 现在我们已经添加了slug 字段,而且我们还可以使用它们作为干净的url。

让我们来看看新类别。

2.3 类别页面运作流程

在设计完我们的url 格式后,让我们开始设计类别页面。我们将采取以下步骤。

1. 将页面模型导入 eva/view.py 文件中。

2. 在 eva/views.py 文件中创建一个新的视图 -我们称之为category - category 视图将采用一个额外的参数,category_name_url,我们将用它来存储编码过的category 名。我们需要一些额外辅助用的函数来编译和解译 category_name_url。

3. 创建一个新的模板,templates/eva/category.html。

4. 更新eva 中的urlpatterns,将新的类别视图映射到 eva/urls.py 的URL模式中。

我们还需要更新index( ) 视图和index.html 模板用来提供链接到类别页面视图中。

2.4 类别视图 (Category View)

在eva/views.py 文件中,我们首先需要导入页面模型。这意味着我们必须在文件的顶部添加以下导入语句。

# Import the page model

from eva.models import Page

接下来,我们加上我们的新视图, category( ), 在我们的index 下面。

def category(request, category_name_slug):

# Create a context dictionary which we can pass to the template rendering engine.

context_dict = {}

try:

# Can we find a category name slug with the given name?

# If we can't, the .get() method raises a DoesNotExist exception.

# So the .get() method returns one model instance or raises an exception.

category = Category.objects.get(slug=category_name_slug)

context_dict['category_name'] = category.name - 这个网站可出售。 - 最佳的domains,category branding 来源和相关信息。

# Retrieve all of the associated pages.

# Note that filter returns >= 1 model instance.

pages = Page.objects.filter(category=category)

# Adds our results list to the template context under name pages.

context_dict['pages'] = pages

# We also add the category object from the database to the context dictionary.

# We'll use this in the template to verify that the category exists.

context_dict['category'] = category

except Category.DoesNotExist:

# We get here if we didn't find the specified category.

# Don't do anything - the template displays the "no category" message for us.

pass

# Go render the response and return it to the client.

return render(request, 'rango/category.html', context_dict)

我们的新视图遵循着与index( ) 视图相同的基本步骤。我们首先定义一个环境字典,然后尝试从模型中提取数据并将相关数据添加到环境字典中。我们通过作为参数category_name_slug 传递给category( ) 视图函数的值来确定类别。如果类别在类别模型中找到,我们就可以提取相关的页面,并将其添加到环境字典context_dict 类型中。

2.5 类模板

现在让我们为新视图创建模板。在 /zhou/templates/rango/ directory中创建category.html 新文件。在新文件中,添加以下代码。

Rango

{% if category %}

{{ category_name }}

{% if pages %}

{% for page in pages %}

{{ page.title }}

{% endfor %}

{% else %}

No pages currently in category.

{% endif %}

{% else %}

The specified category {{ category_name }} does not exist!

{% endif %}

HTML 代码演示了如何利用通过模板环境传递给模板数据,我们使用了category_name 变量以及我们的类别和页面对象。如果在我们的模板环境中没有定义类别,则数据库中就不能找到类别,我们就会发出一个善意的错误消息来提醒。相反,我们则可以安心继续检查页面。

如果我们的页面未定义或不包含元素,我们将显示一条消息,说明不存在该页面。相反,类别中的页面将显示在HTML列表中。对于页面列表中的每个页面,我们将显示它们的标题和url属性。

2.6 有限制的 URL映射

现在让我们看看如何将category_name_url 参数的值传递给category( ) 函数。为此,我们需要修改eva 中的url.py 文件并更新urlpatterns 元组,如下所示。

from django.urls import path

from eva import views

urlpatterns = [

path('', views.index, name='index'),

path('about/', views.about, name='about'),

path('category//', views.category, name='category'),

]

如果你对突然出现的path 第三行category 不理解,没关系,因为这是我们待会会解释的;如果你对第二行 about很懵逼,恭喜你,我一开始也是!!原文中就是突然出现的这一行,不过没关系,就是需要我们多写个视图,小事,我这边都解决了。打开 eva/views.py, 加入下面这段。

# about view here.

def about(request):

# Render the response and send it back!

return render(request, 'rango/about.html')

我因为想对自己的about 链接精益求精一点,所以自己又写了个html 文件。进入我们的zhou/templates/rango 文件夹,新建一个html 文件, about.html,添加如下代码。

{% load staticfiles %}

Zhou

I am Zhou

I am the owner and developer of this website!

Welcome!

Go back

你可以把标题改成自己的名字,我顺便后面加了个link 可以回到主页面。

好,接下来进入我们这一节的主题

#Django 旧版本

url(r'^category/(?P[\w\-]+)/$', views.category, name='category'),) # New!

#Django 新版本

path('category//', views.category, name='category'),

正如你所看到的,我们添加了一个相当复杂的条目,将调用view.category( ) 和正则表达式 ' //(?P[\w\-]+”相匹配。我们设置正则表达式来查找任何字母,数字,字符的序列(例如a-z、A-Z或0-9)和连字符(-),然后在拖尾URL斜杠前查找。然后将该值作为参数category_name_slug传递给view .category( ),这是必填请求参数之后的惟一参数。

而新版本就方便多了,直接说明是连接到category_name_slug 即可,以上解释的内容都帮你搞定了。

2.7 修改Index 模板

我们的新视图已经建立并准备就绪——但是我们还需要做一件事。我们的Index 页面模板需要更新,以便为用户提供查看列出的类别页面的方法。我们可以更新index.html 模板来包含能通过slug 链接到类别页面的链接。

{% load staticfiles %}

Eva

Eva says...hello world!

Most viewed Categories:

{% if categories %}

{% for category in categories %}

{{ category.name }}

{% endfor %}

{% else %}

There are no categories present.

{% endif %}

About

2.8 演示

让我们保存好文件,启动我们的服务器,进入我们的网页一探究竟,都发生了什么有趣的变化。

接着,让我们点击python 类别, 看看里面的内容。

显示了类别里面的有三个页面,是我们在populate_eva.py 文件中放进去的。再让我们点击第一个链接。

Ok, 完美,我们这次的链接设置很成功。有空闲的同学也可以试着自己去加些类别,放些链接在你的类别里哦,别忘记更新数据库就好了。

如果你觉得我的文章有用,顺手点个赞,关注下我的专栏或则留下你的评论吧!

前期准备

1. 请看我的Django基础文章,用Django写出最简单的网页。可以带着大家从无到有,写出一个含有"Hello, world!"的基本网页不会c语言直接学python。最基础的下载等基本操作都在这篇文章了,本系列文章属于更“高级”一点,所以不会再花时间在这方面了。

3. How to tango with Django 1.7。这是一本英文写的手把手教你使用Django的好书,旧版本是online免费的,新版本都需要付费。本系列文章就是根据这本书提供的步骤所写,因为1.7版本很老旧,我也费了很大的功夫更新了一番。大家要是有时间,也推荐好好翻阅一下这本书。

4. django 官网。大家要是还有更多空闲时间想继续深入了解,官网必不可少。

本文目标

现在通过本系列的第一,二篇文章,我们已经建立了模型并在其中填充了数据。本文作为本系列的第三篇文章,目的就是让我们学会可以把东西放在一起。我们将研究如何从视图(views) 中的模型(model) 访问数据,以及如何通过模板(template) 显示这些数据。

写在文前

要想在Django 中创建数据驱动(data driven) 的页面,您必须执行以下五个主要步骤。

1. 将希望使用的模型导入到应用程序的views.py 文件中。

2. 在我们希望使用的视图view 中,做到能够查询模型以获得我们想要呈现的数据。

3. 将模型的结果传递到模板中。

4. 设置模板,以我们希望的方式将数据呈现给用户。

5. 将URL映射到我们的视图。

这些步骤显示了Django 框架是如何将模型、视图和模板三者之间的关注点分离的。

1. 在Rango的主页上显示类别

关于主页面的一个主要的要求就是可以显示我们程序的前五个类别。

1.1 导入需要的模型

为了满足这一要求,我们将进行上述每一个步骤。首先,打开eva/views.py 并从eva 的models.py 文件中导入类别(category) 模型。在views.py 文件中输入下面这段。

# Import the Category model

from eva.models import Category

1.2 修改index 程序

首先,我们要做的是修改views.py 文件中的index() 函数。如果我们还记得本系列前两篇文章的大致内容,我们应该还能记住index() 函数是负责主页面的视图。修改这个函数,使其看起来像下面的示例。

def index(request):

# Query the database for a list of ALL categories currently stored.

# Order the categories by no. likes in descending order.

# Retrieve the top 5 only - or all if less than 5.

# Place the list in our context_dict dictionary which will be passed to the template engine.

category_list = Category.objects.order_by('-likes')[:5]

context_dict = {'categories': category_list}

# Render the response and send it back!

return render(request, 'rango/index.html', context_dict)

这里我引用的是rango, 因为在我的templates 文件夹里为了致敬英文版的教程介绍,在给存放html 网页的地方取了和它一致的名字。大家当然可以取别的名字,只是别忘记在这里改过来。

在这里,我们一次性完成了文前所描述的第二步和第三步。

首先,程序中的第一行代码让我们可以查询类别模型以检索前五类。这里我们使用order_by() 的方法按喜欢数的降序来排序。然后我们将这个列表限制为列表中的前5个类别对象。

category_list = Category.objects.order_by('-likes')[:5]

查询完成后,我们将对列表(存储为变量category_list) 的引用传递给字典context_dict。然后,该字典作为render() 调用中模板引擎内容的一部分被传递。

context_dict = {'categories': category_list}

# Render the response and send it back!

return render(request, 'rango/index.html', context_dict)

1.3 修改index.html, models.py 和 admin.py

随着视图的更新,剩下我们要做的就是更新模板rango/index.html 文件,位于项目的模板目录中 /zhou/templates/rango。更改文件的HTML代码,使其看起来类似如下所示的示例。

{% load staticfiles %}

Eva

Eva says...hello world!

{% if categories %}

{% for category in categories %}

{{ category.name - 这个网站可出售。 - 最佳的domains,category branding 来源和相关信息。 }}

{% endfor %}

{% else %}

There are no categories present.

{% endif %}

About

我们还需要在models.py 还有 admin.py文件中,让服务器知道我们添加了views, likes。

在eva/models.py 中修改代码如下所示:

from django.db import models

# Create your models here.

class Category(models.Model):

name = models.CharField(max_length=128, unique=True)

views = models.IntegerField(default=0, unique=False)

likes = models.IntegerField(default=0, unique=False)

def __str__(self):

return self.name

class Page(models.Model):

category = models.ForeignKey(Category, on_delete=models.CASCADE,)

title = models.CharField(max_length=128)

url = models.URLField()

views = models.IntegerField(default=0, unique=False)

likes = models.IntegerField(default=0, unique=False)

def __str__(self):

return self.title

在eva/admin.py 文件中修改如下所示:

from django.contrib import admin

# Register your models here.

from eva.models import Category, Page

class PageAdmin(admin.ModelAdmin):

list_display = ('title', 'category', 'url')

class CatAdmin(admin.ModelAdmin):

list_display = ('views', 'likes')

admin.site.register(Category, CatAdmin)

admin.site.register(Page, PageAdmin)

因为我们添加了新的变量views, likes 在类别中,对模型进行了改动,所以如上篇文章所讲的,我们需要通过特定应用程序makemiations 命令来表示这些更改。

python3 manage.py migrate

# 以下是结果

Operations to perform:

Apply all migrations: admin, auth, contenttypes, eva, sessions

Running migrations:

Applying eva.0002_auto_20180625_2139... OK

现在让我们保存各个文件,进入网页地址:http://127.0.0.1:8880/eva/ ,我们就能看到包含三个类别的网页了,如下图。

2. 创建有细节的页面

根据eva 的要求,我们还需要能够显示与每个类别关联的页面列表。我们需要可以创建一个新的视图,并将其参数化。我们还需要创建URL 模式和URL 字符串来编码类别名。

2.1 URL 设计和映射

首先我们需要考虑URL 的特性。其中一个就是每个URL中的每个类别包含各自唯一的ID。例如,我们可以创建url,比如/eva/category/1/ 或 /eva/category/2/,其中的数字分别对应于id为1和2的类别。然而,这些url 是为机器设计的,不容易被人类理解。尽管我们可以推断这个数字与一个类别有关,但是我们如何知道哪个类别与是id 1或2 呢? 我们必须经过尝试才能知道。

相反,如果我们可以使用类别名称作为URL的一部分,那就明了多了。/eva/category/Python/ 应该是包含了一个与Python类别相关的页面列表。这是一个简单、可读和有意义的URL。

2.2 使用Slug 字段更新类别表

如果我们想要创建整洁的url,我们将在类别模型中包含一个slug 字段。

“鼻涕虫”(slug) 在这里有什么用呢? 我查了下官网,解释是“这是一种短标签,只包含字母、数字、下划线或连字符。它们通常用在url中。”我自己理解就是,可以让你的url 包含关于链接内容的描述性信息,比如说这个url, https://zhou-1.github.io/zhou.github.io/handsome-zhou 这是我自己瞎编的一个网址。。。。后面的handsome-zhou就是说明点击这个链接,会把我们带到一个说我多帅的一个网页,很简洁,很明了,毕竟是事实。(逃。。。。

言归正传,讲我们接下去的步骤,

首先,我们需要从django 中导入函数slugify,它将用连字符i 来代替空白区间。举个例子,这句话“我 如 何 在 django 中 创 建 一 个 slag”变成了“我-如-何-在-django-中-创-建-一-个-slag”(英文原文是:“how do i create a slug in django” turns into “how-do-i-create-a-slug-in-django”我私自把它汉化了,放上原文,大家可以对比感受下)。

然后我们需要重写类别模型的保存方法,我们将该方法称为slugify 并使用它来更新slug 字段。注意,每当类别名称发生变化时,slug 也会发生变化,从而导致链接损坏。我们可以通过只在创建对象时定义slug 来防止这种情况。好,让我们来更新模型,在eva/models.py文件中更新代码如下所示。

from django.template.defaultfilters import slugify

# Create your models here.

class Category(models.Model):

name = models.CharField(max_length=128, unique=True)

views = models.IntegerField(default=0, unique=False)

likes = models.IntegerField(default=0, unique=False)

slug = models.SlugField()

def save(self, *args, **kwargs):

# Uncomment if you don't want the slug to change every time the name changes

#if Domain Name Registration with Privacy & Cheap Price is None:

#self.slug = slugify(self.name)

self.slug = slugify(self.name)

super(Category, self).save(*args, **kwargs)

def __str__(self):

return self.name

现在我们已经对模型执行了更新,但我们仍然需要执行迁移。

python3 manage.py makemigrations eva

#下面是结果和需要输入的信息

You are trying to add a non-nullable field 'slug' to category without a default; we can't do that (the database needs something to populate existing rows).

Please select a fix:

1) Provide a one-off default now (will be set on all existing rows with a null value for this column)

2) Quit, and let me add a default in models.py

Select an option: 1 #这里输入1

Please enter the default value now, as valid Python

The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now

Type 'exit' to exit this prompt

>>> '' #这里输入''

Migrations for 'eva':

eva/migrations/0003_category_slug.py

- Add field slug to category

python3 manage.py migrate

# 下面是结果

Operations to perform:

Apply all migrations: admin, auth, contenttypes, eva, sessions

Running migrations:

Applying eva.0003_category_slug... OK

由于我们没有为slug 提供默认值,并且模型中已有数据,因此迁移命令将在执行makemigrations 后为我们提供两个选项。选择提供默认值的选项1,并输入' ' 。现在重新运行我们的填充脚本。

python3 populate_eva.py

#以下是结果

Starting eva population ...

- Python - Official Python Tutorial

- Python - How to Think like a Computer Scientist

- Python - Learn Python in 10 Minutes

- Django - Official Django Tutorial

- Django - Django Rocks

- Django - How to Tango with Django

- Other Frameworks - Bottle

- Other Frameworks - Flask

由于每个类别都能调用保存方法,因此每次保存将执行覆盖方式来更新slug 字段。运行服务器,并通过管理界面来观察模型中的数据。

在管理界面中,我们希望它能自动预填充slug 字段作为类别名称中的类型。为此,我们需要更新eva/admin.py,代码如下:

from django.contrib import admin

# Register your models here.

from eva.models import Category, Page

class PageAdmin(admin.ModelAdmin):

list_display = ('title', 'category', 'url')

class CatAdmin(admin.ModelAdmin):

list_display = ('name','views', 'likes')

prepopulated_fields = {'slug':('name',)}

admin.site.register(Category, CatAdmin)

admin.site.register(Page, PageAdmin)

现在让我们尝试在管理界面添加一个新的类别。Awesome! 现在我们已经添加了slug 字段,而且我们还可以使用它们作为干净的url。

让我们来看看新类别。

2.3 类别页面运作流程

在设计完我们的url 格式后,让我们开始设计类别页面。我们将采取以下步骤。

1. 将页面模型导入 eva/view.py 文件中。

2. 在 eva/views.py 文件中创建一个新的视图 -我们称之为category - category 视图将采用一个额外的参数,category_name_url,我们将用它来存储编码过的category 名。我们需要一些额外辅助用的函数来编译和解译 category_name_url。

3. 创建一个新的模板,templates/eva/category.html。

4. 更新eva 中的urlpatterns,将新的类别视图映射到 eva/urls.py 的URL模式中。

我们还需要更新index( ) 视图和index.html 模板用来提供链接到类别页面视图中。

2.4 类别视图 (Category View)

在eva/views.py 文件中,我们首先需要导入页面模型。这意味着我们必须在文件的顶部添加以下导入语句。

# Import the page model

from eva.models import Page

接下来,我们加上我们的新视图, category( ), 在我们的index 下面。

def category(request, category_name_slug):

# Create a context dictionary which we can pass to the template rendering engine.

context_dict = {}

try:

# Can we find a category name slug with the given name?

# If we can't, the .get() method raises a DoesNotExist exception.

# So the .get() method returns one model instance or raises an exception.

category = Category.objects.get(slug=category_name_slug)

context_dict['category_name'] = category.name - 这个网站可出售。 - 最佳的domains,category branding 来源和相关信息。

# Retrieve all of the associated pages.

# Note that filter returns >= 1 model instance.

pages = Page.objects.filter(category=category)

# Adds our results list to the template context under name pages.

context_dict['pages'] = pages

# We also add the category object from the database to the context dictionary.

# We'll use this in the template to verify that the category exists.

context_dict['category'] = category

except Category.DoesNotExist:

# We get here if we didn't find the specified category.

# Don't do anything - the template displays the "no category" message for us.

pass

# Go render the response and return it to the client.

return render(request, 'rango/category.html', context_dict)

我们的新视图遵循着与index( ) 视图相同的基本步骤。我们首先定义一个环境字典,然后尝试从模型中提取数据并将相关数据添加到环境字典中。我们通过作为参数category_name_slug 传递给category( ) 视图函数的值来确定类别。如果类别在类别模型中找到,我们就可以提取相关的页面,并将其添加到环境字典context_dict 类型中。

2.5 类模板

现在让我们为新视图创建模板。在 /zhou/templates/rango/ directory中创建category.html 新文件。在新文件中,添加以下代码。

Rango

{% if category %}

{{ category_name }}

{% if pages %}

{% for page in pages %}

{{ page.title }}

{% endfor %}

{% else %}

No pages currently in category.

{% endif %}

{% else %}

The specified category {{ category_name }} does not exist!

{% endif %}

HTML 代码演示了如何利用通过模板环境传递给模板数据,我们使用了category_name 变量以及我们的类别和页面对象。如果在我们的模板环境中没有定义类别,则数据库中就不能找到类别,我们就会发出一个善意的错误消息来提醒。相反,我们则可以安心继续检查页面。

如果我们的页面未定义或不包含元素,我们将显示一条消息,说明不存在该页面。相反,类别中的页面将显示在HTML列表中。对于页面列表中的每个页面,我们将显示它们的标题和url属性。

2.6 有限制的 URL映射

现在让我们看看如何将category_name_url 参数的值传递给category( ) 函数。为此,我们需要修改eva 中的url.py 文件并更新urlpatterns 元组,如下所示。

from django.urls import path

from eva import views

urlpatterns = [

path('', views.index, name='index'),

path('about/', views.about, name='about'),

path('category//', views.category, name='category'),

]

如果你对突然出现的path 第三行category 不理解,没关系,因为这是我们待会会解释的;如果你对第二行 about很懵逼,恭喜你,我一开始也是!!原文中就是突然出现的这一行,不过没关系,就是需要我们多写个视图,小事,我这边都解决了。打开 eva/views.py, 加入下面这段。

# about view here.

def about(request):

# Render the response and send it back!

return render(request, 'rango/about.html')

我因为想对自己的about 链接精益求精一点,所以自己又写了个html 文件。进入我们的zhou/templates/rango 文件夹,新建一个html 文件, about.html,添加如下代码。

{% load staticfiles %}

Zhou

I am Zhou

I am the owner and developer of this website!

Welcome!

Go back

你可以把标题改成自己的名字,我顺便后面加了个link 可以回到主页面。

好,接下来进入我们这一节的主题

#Django 旧版本

url(r'^category/(?P[\w\-]+)/$', views.category, name='category'),) # New!

#Django 新版本

path('category//', views.category, name='category'),

正如你所看到的,我们添加了一个相当复杂的条目,将调用view.category( ) 和正则表达式 ' //(?P[\w\-]+”相匹配。我们设置正则表达式来查找任何字母,数字,字符的序列(例如a-z、A-Z或0-9)和连字符(-),然后在拖尾URL斜杠前查找。然后将该值作为参数category_name_slug传递给view .category( ),这是必填请求参数之后的惟一参数。

而新版本就方便多了,直接说明是连接到category_name_slug 即可,以上解释的内容都帮你搞定了。

2.7 修改Index 模板

我们的新视图已经建立并准备就绪——但是我们还需要做一件事。我们的Index 页面模板需要更新,以便为用户提供查看列出的类别页面的方法。我们可以更新index.html 模板来包含能通过slug 链接到类别页面的链接。

{% load staticfiles %}

Eva

Eva says...hello world!

Most viewed Categories:

{% if categories %}

{% for category in categories %}

{{ category.name }}

{% endfor %}

{% else %}

There are no categories present.

{% endif %}

About

2.8 演示

让我们保存好文件,启动我们的服务器,进入我们的网页一探究竟,都发生了什么有趣的变化。

接着,让我们点击python 类别, 看看里面的内容。

显示了类别里面的有三个页面,是我们在populate_eva.py 文件中放进去的。再让我们点击第一个链接。

Ok, 完美,我们这次的链接设置很成功。有空闲的同学也可以试着自己去加些类别,放些链接在你的类别里哦,别忘记更新数据库就好了。

如果你觉得我的文章有用,顺手点个赞,关注下我的专栏或则留下你的评论吧!