二 Django入门(11)


# vim learning_logs/models.py
from django.db import modelsfrom django.contrib.auth.models import Userclass Topic(models.Model):"""用户学习的主题"""text = models.CharField(max_length=200)date_added = models.DateTimeField(auto_now_add=True)owner = models.ForeignKey(User, on_delete=models.CASCADE)def __str__(self):"""返回模型的字符串表示"""return self.textclass Entry(models.Model):"""学到的有关某个主题的具体知识"""topic = models.ForeignKey(Topic, on_delete=models.CASCADE)text = models.TextField()date_added = models.DateTimeField(auto_now_add=True)class Meta:verbose_name_plural = 'entries'def __str__(self):"""返回模型的字符串表示"""return self.text[:50] + "..."
首先导入了..auth中的模型User , 然后在Topic中添加了字段owner , 它建立到模型User的外键关系 。
迁移数据库时 , 将对数据库进行修改 , 使其能够存储主题和用户之间的关联 。为执行迁移 , 需要知道该将各个既有主题关联到哪个用户 。最简单的办法是 , 将既有主题都关联到同一个用户 , 如超级用户 。为此 , 我们需要知道用户的ID 。
# python manage.py shell>>> from django.contrib.auth.models import User>>> User.objects.all(), ]>>>> for user in User.objects.all():...print(user.username, user.id)... ll_admin 1lzx 2
# python manage.py makemigrations learning_logsSelect an option: 1#选择第1个选项——现在提供默认值>>> 1#输入用户IDMigrations for 'learning_logs':learning_logs/migrations/0003_topic_owner.py- Add field owner to topic
将所有既有主题都关联到管理用户 , 我输入了用户ID值1 。并非必须使用超级用户 , 也可使用已创建的任何用户的ID 。
# python manage.py migrate#执行迁移# python manage.py shell>>> from learning_logs.models import Topic>>> for topic in Topic.objects.all():...print(topic, topic.owner)... Chess ll_adminRock Climbing ll_admin
可以看到 , 每个主题的所有者是超级用户 。
注意:也可以重置数据库而不是迁移它 , 但如果这样做 , 既有的数据都将丢失 。如果确实想要一个新的数据库 , 可以执行命令 .py flush , 这会重建数据库的结构 。如果你这样做 , 就需要重新创建超级用户 , 且原来的所有数据都将丢失 。
只允许用户访问自己的主题
# vim learning_logs/views.py
@login_requireddef topics(request):"""显示所有主题"""topics = Topic.objects.filter(owner=request.user).order_by('date_added')#修改context = {'topics': topics}return render(request, 'learning_logs/topics.html', context)
用户登录后 , 对象将有一个user属性 , 这个属性存储了有关该用户的信息 。代码Topic..(owner=.user)让只从数据库中获取owner属性为当前用户的Topic对象 。
要查看结果 , 以所有既有主题关联到的用户的身份登录(这里我们是)并访问页面 , 你将看到所有的主题 。然后 , 注销并以另一个用户的身份登录 , 页面将不会列出任何主题 。
保护用户的主题
接下来限制对单个主题的页面的访问 。
# vim learning_logs/views.py