最近在学习Django的时候,照着书本上的例子做了几遍,一开始总是对models.py、views.py、urls.py与html文件之间的关联很迷惑,不知道相互之间数据是怎么传递的。相信许多接触python的初学者和我一样也遇到这样的困惑。我这里用通俗的语言解释一下,个别用词可能不是很准确,只是为了理解方便。
主要的问题是,搞清楚数据库中的表格的数据是怎么传递给HTML文件的。
要搞清楚这个问题,得先弄清楚models.py、views.py、urls.py与html文件之间的关联。
1、models.py是建立表格。
你在models.py中创建一个类,就是建立了一个表格。比如,你创建了Topic类。其实就是创建了Topic表格(数据库中对应的表格名称是app名称_topic)。所以,Topic类中定义的变量,其实就是数据库中表的字段名。有几个变量,就有几列。比如你在models.py中创建了这么一个类Topic:
class Topic(models.Model):
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
text2 = models.CharField(max_length=20)
def __str__(self):
return self.text
这其实就是在数据库中创建了一个表格,该表格有3列,每列字段名是text、date_added、text2。
你想将数据库中表的数据送给html网页进行处理并显示,这中间的桥梁就是views.py中定义的函数。可以这么理解,models.py是在数据库中创建表格。views.py创建的每一个函数,就是将数据库中某一个表格的数据传递给相应的HTML网页。比如:
def topics(request):
topics = Topic.objects.order_by('date_added')
context = {'topics':topics}
return render(request,'learning_logs/topics.html',context)
在views.py中,topics函数,注意是函数,不是类。topics函数,先从数据库的表格中获取数据。获取表格数据,使用Model类的objects属性。Topic是Model类型。(model.Model类型)。objects返回的是一个列表。但注意,objects返回的并不是表格中所有的数据。比如,Topic表格有3个列:text,date_added,text2。但实际上,objects返回的数据只是text列的数据。为什么呢?因为Topic类定义的时候,str(self)函数返回的是text。所以,views.py中,你使用objects返回的只是text列数据组成的列表。上例中,topics就是含有text列数据的列表。
context是一个字典,该字典的键值对是’topics’:text数据列表。render()函数将字典context传递给了相应的html。
然后,HTML文件中就可以使用context的数据了。在HTML中,你可以直接使用context字典的键名来获取数据。注意是键名,不是值名称。比如上例context = {‘topics’:topics},在HTML中使用是如下:
{% for topic in topics %}
<li>
<a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
</li>
{% empty %}
<li>没有添加任何主题</li>
{% endfor %}
注意,这里的for topic in topics中的topics不是context的值名,而是键名称。比如,你把context改为context = {‘TopicTextData’:topics},则HTML中使用数据就必须改为{% for topic in TopicTextData %} 。
urls.py其实与你读数据库表格中的数据、传递数据给HTML没有任何关系。urls.py只是负责将浏览器输入的url地址引导至相应的views.py中的函数。urls.py中的一个path()或re_path()负责将浏览器输入的url地址对应到views.py中的某一个函数。
总的来说,你想要将数据库中表格的数据传递给HTML网页使用,第一步,在model.py中创建一个类,也就是创建表格。第二步,在views.py中创建一个函数,这个函数负责从表格中获取数据,再装进一个字典类型的变量中,然后通过return render()将字典变量传递给相应的HTML文件。第三步,HTML文件中使用字典的键名获取数据,并处理显示。
走完这三步,是将数据库中表格的数据传递给了HTML文件显示。但此时输入HTML文件的url地址还不能正确显示。你还必须在urls.py中通过path()或re_path()函数将浏览器的url地址引导到views.py的对应函数。例如:
urlpatterns = [
......
re_path(r'^topics/$',views.topics,name='topics'),
]