美文网首页
The Django Book 第六章 Django站点管理

The Django Book 第六章 Django站点管理

作者: Alex_Honnold | 来源:发表于2017-10-14 10:39 被阅读0次

    本书网站链接

    django.contrib 包,这一章,讲述django.contrib.admin。

    关于admin的介绍,还是看书表好。链接

    # 创建admin登录的超级用户
    python manage.py createsuperuser
    

    修改成中文:
    添加

    'django.middleware.locale.LocaleMiddleware' 
    

    到setting.py文件中的MIDDLEWARE_CLASSES设置中,并确保它在 'django.contrib.sessions.middleware.SessionMiddleware' 后面 。

    将你的模型(Models)加入到Admin管理中:
    admin.py文件添加如下内容:

    from django.contrib import admin
    from mysite.books.models import Publisher, Author, Book
    
    admin.site.register(Publisher)
    admin.site.register(Author)
    admin.site.register(Book)
    

    设置字段可选:
    举个例子,我们想要Author模块中的email字段成为可选,即允许不填。

    # 在models.py文件里修改
    class Author(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=40)
        email = models.EmailField(**blank=True** )
    

    设置日期型和数字型字段可选:
    虽然blank=True同样适用于日期型和数字型字段。
    SQL有指定空值的独特方式,它把空值叫做NULL。NULL可以表示为未知的、非法的、或其它程序指定的含义。
    在SQL中, NULL的值不同于空字符串,就像Python中None不同于空字符串("")一样。这意味着某个字符型字段(如VARCHAR)的值不可能同时包含NULL和空字符串。

    为了消除歧义,Django生成CREATE TABLE语句自动为每个字段显式加上NOT NULL。

    CREATE TABLE "books_author" (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(40) NOT NULL,
    "email" varchar(75) NOT NULL
    )
    ;
    

    在大多数情况下,这种默认的行为对你的应用程序来说是最佳的,因为它可以使你不再因数据一致性而头痛。
    而且它可以和Django的其它部分工作得很好。如在管理工具中,如果你留空一个字符型字段,它会为此插入一个空字符串(而* 不是*NULL)。

    但是,其它数据类型有例外:日期型、时间型和数字型字段不接受空字符串。 如果你尝试将一个空字符串插入日期型或整数型字段,你可能会得到数据库返回的错误,这取决于那个数据库的类型。(PostgreSQL比较严禁,会抛出一个异常;MySQL可能会也可能不会接受,这取决于你使用的版本和运气了。)在这种情况下,NULL是唯一指定空值的方法。 在Django模块中,你可以通过添加null=True来指定一个字段允许为NULL。

    因此,这说起来有点复杂: 如果你想允许一个日期型(DateField、TimeField、DateTimeField)或数字型(IntegerField、DecimalField、FloatField)字段为空,你需要使用null=True * 和* blank=True。

    # 举例说明,让我们把Book模块修改成允许 publication_date为空。修改后的代码如下:
    class Book(models.Model):
        title = models.CharField(max_length=100)
        authors = models.ManyToManyField(Author)
        publisher = models.ForeignKey(Publisher)
        publication_date = models.DateField(**blank=True, null=True** )
    

    出于某种原因,Django不会尝试自动更新数据库结构。所以你必须执行ALTER TABLE语句将模块的改动更新至数据库。

    自定义字段标签:
    在编辑页面中,每个字段的标签都是从模块的字段名称生成的。 规则很简单: 用空格替换下划线;首字母大写。例如:Book模块中publication_date的标签是Publication date。
    自定义标签,模块中指定verbose_name

    # 举个例子,说明如何将Author.email的标签改为e-mail,中间有个横线。
    class Author(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=40)
        email = models.EmailField(blank=True, **verbose_name='e‐mail'** )
    

    为了使语法简洁,你可以把它当作固定位置的参数传递。 这个例子与上面那个的效果相同。

    class Author(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=40)
        email = models.EmailField(**'e‐mail',** blank=True)
    

    但这不适用于ManyToManyField 和ForeignKey字段,因为它们第一个参数必须是模块类。 那种情形,必须显式使用verbose_name这个参数名称。

    自定义ModelAdmi类:
    自定义列表:

    # 在admin管理页面,显示的是self.first_name self.last_name
    class Author(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=40)
        email = models.EmailField(blank=True, verbose_name='e‐mail')
        
        **def __unicode__(self):**
            **return u'%s %s' % (self.first_name, self.last_name)**
    

    改进后的显示列表:

    from django.contrib import admin
    from mysite.books.models import Publisher, Author, Book
    
    **class AuthorAdmin(admin.ModelAdmin):**
        **list_display = ('first_name', 'last_name', 'email')**
    admin.site.register(Publisher)
    **admin.site.register(Author, AuthorAdmin)**
    admin.site.register(Book)
    

    添加快速查询栏:

    class AuthorAdmin(admin.ModelAdmin):
        list_display = ('first_name', 'last_name', 'email')
        **search_fields = ('first_name', 'last_name')**
    

    过滤日期,使用date_hierarchy选项:

    class BookAdmin(admin.ModelAdmin):
        list_display = ('title', 'publisher', 'publication_date')
        list_filter = ('publication_date',)
        **date_hierarchy = 'publication_date'**
    

    排序:

    class BookAdmin(admin.ModelAdmin):
        list_display = ('title', 'publisher', 'publication_date')
        list_filter = ('publication_date',)
        date_hierarchy = 'publication_date'
        **ordering = ('‐publication_date',)**
    

    自定义编辑表单:
    首先,我们先自定义字段顺序。 默认地,表单中的字段顺序是与模块中定义是一致的。 我们可以通过使用ModelAdmin子类中的fields选项来改变它:

    class BookAdmin(admin.ModelAdmin):
        list_display = ('title', 'publisher', 'publication_date')
        list_filter = ('publication_date',)
        date_hierarchy = 'publication_date'
        ordering = ('‐publication_date',)
        **fields = ('title', 'authors', 'publisher', 'publication_date')**
    

    通过fields这个选项,你可以排除一些不想被其他人编辑的fields 只要不选上不想被编辑的field(s)即可。
    例如,在book数据库中,我们可以隐藏publication_date,以防止它被编辑。

    class BookAdmin(admin.ModelAdmin):
        list_display = ('title', 'publisher', 'publication_date')
        list_filter = ('publication_date',)
        date_hierarchy = 'publication_date'
        ordering = ('‐publication_date',)
        **fields = ('title', 'authors', 'publisher')**
    

    filter_horizontal filter_vertical:

    class BookAdmin(admin.ModelAdmin):
        list_display = ('title', 'publisher', 'publication_date')
        list_filter = ('publication_date',)
        date_hierarchy = 'publication_date'
        ordering = ('‐publication_date',)
        **filter_horizontal = ('authors',)**
    

    filter_horizontal和filter_vertical选项只能用在多对多字段 上, 而不能用于 ForeignKey字段。

    但有时候,因为列表项太多,加载消耗太多性能,解决这个问题的办法是使用raw_id_fields 选项:

    class BookAdmin(admin.ModelAdmin):
        list_display = ('title', 'publisher', 'publication_date')
        list_filter = ('publication_date',)
        date_hierarchy = 'publication_date'
        ordering = ('‐publication_date',)
        filter_horizontal = ('authors',)
        **raw_id_fields = ('publisher',)**

    相关文章

      网友评论

          本文标题:The Django Book 第六章 Django站点管理

          本文链接:https://www.haomeiwen.com/subject/uaxoyxtx.html