本文源自 Reddit 上对我最近的一个帖子的评论:
“问题是,我问到的每个人都持反对意见,他们认为 admin 只限于超级用户,很不灵活并且是难以定制。”
—来自 Reddit 的 andybak
我现在要澄清这个误解。Django 的 admin 绝对是软件中的亮点,可以有效的加速你的开发。
这里有一些我能想到的很有用的 Django 的 admin 模块的窍门。
(对于 Django admin 不太熟悉的人,先简单解释几个名词)
Changeform 是可以编辑对象的页面。
Changelist 页面可以列出指定类型的对象。你可以指定过滤对象的条件及对对象的操作。点击 changelist 里的对象一般会跳转到对象的 changeform 页面。
为了让这些敲门更具可操作性,我们使用了与真实问题几乎一致的场景。假设我们有一个简单的网站,访客可以上传可爱的动物图片并进行评论。这是不是很流行呢?
Tip 1:Django admin 后台不限于用 Django 开发的网站
虽然 Django admin 管理界面可以非常友好的用在 Django 项目的其它部分,它同样可以很容易用于其它像传统的数据库或具有一个可怕的的管理界面的网站。而且这也是评估 Django 是否会满足您的需求的最佳途径。
你需要做的仅是:
- 在你的 Django 项目中建立一个新的应用,并确保你已经连接好传统数据库 ,通过 settings.py 文件中的 DATABASES 的设置。
- 将你的数据表定义为 Django 的模型。正如它的名字所表述的,manage.py inspectdb 是一个非常有用的命令:检测现有的数据库,并打印出自动生成的 Django 模型。
- 创建 admin.py 文件,并放在那里,唉,管理相关的。稍后将详细说明这个。
说到我们的动物“的网站,是由进屎的脑袋写出来的,所以管理界面看起来像……你知道的,不是很好。为了解决这个问题,我们通过几个 Django 模型重构了数据库结构,实现一个简单的管理界面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# models.py class Picture(models.Model): DOG = 1 CAT = 2 ANIMAL_KIND_CHOICES = ( (DOG, 'dog'), (CAT, 'cat'), ) title = models.CharField(max_length=200) author = models.ForeignKey(Author, related_name='pictures') animal_kind = models.IntegerField(choices=ANIMAL_KIND_CHOICES) photo = models.ImageField(upload_to='animals') is_promoted = models.BooleanField(default=False) class Author(models.Model): name = models.CharField(max_length=100) email = models.EmailField() class Comment(models.Model): author = models.ForeignKey(Author, related_name='comments') picture = models.ForeignKey(Picture, related_name='comments') comment = models.TextField() editors_note = models.TextField() # admin.py class PictureAdmin(admin.ModelAdmin): list_display_fields = ('photo', 'animal_kind', 'author', 'is_promoted', ) class AuthorAdmin(admin.ModelAdmin): list_display_fields = ('name', 'email', ) class CommentAdmin(admin.ModelAdmin): list_display_fields = ('picture', 'author', ) |
Tip #2: 按你喜欢的方式筛选你的数据
很多人使用 Django admin 后台对指定字段进行筛选。要知道,把一个字段名放到 list_filter 列表里就可以了。同时它也非常容易地创建一个自定义过滤器!
假如最终你决定要推广所有有 100+ 的帖子的作者。但是,我们如何区分它们?让我们创建一个过滤器,并把它添加到我们的变更列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
class ProductiveAuthorsFilter(admin.SimpleListFilter): parameter_name = 'is_productive' title = 'Productive author' YES, NO = 1, 0 # Number of comments for an author to be considered a productive one THRESHOLD = 100 def lookups(self, request, model_admin): return ( (self.YES, 'yes'), (self.NO, 'no'), ) def queryset(self, request, queryset): qs = queryset.annotate(Count('comments')) # Note the syntax. This way we avoid touching the queryset if our # filter is not used at all. if self.value() == self.YES: return qs.filter(comments__count__gte=self.THRESHOLD) if self.value() == self5812b2ca02360816345246-22"> if self.value() == self问题是,我问到的每个人都持反对意见,他们认为 admin 只限于超级用户,很不灵活并且是难以定制。” —来自 Reddit 的 andybak 我现在要澄清这个误解。Django 的 admin 绝对是软件中的亮点,可以有效的加速你的开发。 这里有一些我能想到的很有用的 Django 的 admin 模块的窍门。 (对于 Django admin 不太熟悉的人,先简单解释几个名词)
为了让这些敲门更具可操作性,我们使用了与真实问题几乎一致的场景。假设我们有一个简单的网站,访客可以上传可爱的动物图片并进行评论。这是不是很流行呢? Tip 1:Django admin 后台不限于用 Django 开发的网站虽然 Django admin 管理界面可以非常友好的用在 Django 项目的其它部分,它同样可以很容易用于其它像传统的数据库或具有一个可怕的的管理界面的网站。而且这也是评估 Django 是否会满足您的需求的最佳途径。 你需要做的仅是:
说到我们的动物“的网站,是由进屎的脑袋写出来的,所以管理界面看起来像……你知道的,不是很好。为了解决这个问题,我们通过几个 Django 模型重构了数据库结构,实现一个简单的管理界面:
Tip #2: 按你喜欢的方式筛选你的数据很多人使用 Django admin 后台对指定字段进行筛选。要知道,把一个字段名放到 list_filter 列表里就可以了。同时它也非常容易地创建一个自定义过滤器! 假如最终你决定要推广所有有 100+ 的帖子的作者。但是,我们如何区分它们?让我们创建一个过滤器,并把它添加到我们的变更列表。
|