Python之django(四)

作者: 词穷又词贫 | 来源:发表于2017-02-23 15:13 被阅读13次

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!
    Django提供一个管理数据库的app,即django.contrib.admin。这是Django最方便的功能之一。通过该app,我们可以直接经由web页面,来管理我们的数据库。这一工具,主要是为网站管理人员使用。
    这个app通常已经预装好,你可以在mysite/settings.py中的INSTALLED_APPS看到它。

    默认界面

    启动一个django项目默认会在urls.py配置文件下有:
    #
    from django.conf.urls import patterns, include, url
    from django.contrib import admin
    admin.autodiscover() //admin
    urlpatterns = patterns ('',
    url(r'^admin/', include(admin.site.urls)), // admin
    url(r'^$','mysite.views.first_page'),
    url(r'^west/',include('west.urls')),
    )
    数据模型先必须注册到admin才能被管理。
    在west/admin.py中:注册之前Character数据模型(类,一张数据库表结构)
    #
    from django.contrib import admin
    from west.models import Character
    # Register your models here.
    admin.site.register(Character)
    接着我们就可以访问http://localhost:8000/admin
    这里admin在urls.py中映射到视图admin.site.urls,默认的,自动去搜索
    注意:打开admin页面时,实验环境是django1.8,python3.4报错了,
    # 'WSGIRequest' object has no attribute 'user'
    django1.9之前(settings.py) MIDDLEWARE 应该是MIDDLEWARE_CLASSES 1.9之后的版本应该是叫MIDDLEWARE
    修改此处解决错误。
    登录admin的用户是在进行DB同步时,创建的管理员账户。

    1

    复杂模型

    在west/models.py中创建复杂数据模型
    #
    from django.db import models
    # Create your models here.
    class Contact(models.Model):
    name = models.CharField(max_length=200)
    age = models.IntegerField(default=0)
    email = models.EmailField()
    def unicode(self):
    return self.name
    class Tag(models.Model):
    contact = models.ForeignKey(Contact)
    name = models.CharField(max_length=50)
    def unicode(self):
    return self.name
    两个表,Tag与Contact,Tag以Contact为外键约束,id在Content中没有表示为主键,怎么可以当其他表的外键呢?还是说不是这样理解。
    同步数据库:
    # python3.4 manage.py syncdb
    # 提示信息:
    # Your models have changes that are not yet reflected in a migration, and so won't be applied.
    # Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.
    # 按照提示运行
    # python3.4 manage.py makemigrations
    # python3.4 manage.py syncdb
    将数据模型注册到admin管理
    # from django.contrib import admin
    # from west.models import Character, Contact, Tag
    # # Register your models here.
    # admin.site.register([Character, Contact, Tag])

    2

    自定义页面

    可以自定义管理页面,来取代默认的页面。比如上面的"add"页面。我们想只显示name和email部分。修改west/admin.py:
    # from django.contrib import admin
    # from west.models import Character, Contact, Tag

    # # Register your models here.
    # class ContactAdmin(admin.ModelAdmin):
    #     fields = ('name','email')
    
    # admin.site.register(Contact, ContactAdmin)
    # admin.site.register([Character, Tag])
    

    上面定义了一个ContactAdmin类,用以说明管理页面的显示格式。里面的fields属性,用以说明要显示的输入栏。我们没有让"age"显示。由于该类对应的是Contact数据模型,我们在注册的时候,需要将它们一起注册。
    我们还可以将输入栏分块,给每一块输入栏以自己的显示格式。修改west/admin.py为:
    # from django.contrib import admin
    # from west.models import Character,Contact,Tag

    # # Register your models here.
    # class ContactAdmin(admin.ModelAdmin):
    #     fieldsets = (
    #         ['Main',{
    #             'fields':('name','email'),
    #         }],
    #         ['Advance',{
    #             'classes': ('collapse',), # CSS
    #             'fields': ('age',),
    #         }]
    #     )
    
    # admin.site.register(Contact, ContactAdmin)
    # admin.site.register([Character, Tag])
    

    上面的栏目分为了Main和Advance两部分。classes说明它所在的部分的CSS格式。这里让Advance部分收敛起来

    3

    Inline显示

    上面的Contact是Tag的外部键,所以有外部参考的关系。而在默认的页面显示中,将两者分离开来,无法体现出两者的从属关系。我们可以使用Inline显示,让Tag附加在Contact的编辑页面上显示。
    修改west/admin.py:
    # from django.contrib import admin
    # from west.models import Character,Contact,Tag

    # # Register your models here.
    # class TagInline(admin.TabularInline):
    #     model = Tag
    
    # class ContactAdmin(admin.ModelAdmin):
    #     inlines = [TagInline]  # Inline
    #     fieldsets = (
    #         ['Main',{
    #             'fields':('name','email'),
    #         }],
    #         ['Advance',{
    #             'classes': ('collapse',),
    #             'fields': ('age',),
    #         }]
    #     )
    # admin.site.register(Contact, ContactAdmin)
    # admin.site.register([Character])
    

    显示效果:

    4

    添加搜索栏:
    在class ContactAdmin类中添加:
    # search_fields = ('name',)

    5

    相关文章

      网友评论

        本文标题:Python之django(四)

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