主要是一些定制的问题,其实django admin已经集成的非常好了,该有的都有了,一般开箱即用就行了。

如果你对Django Admin不熟悉的话,这里有一篇很好的介绍。

dependent select fields

其实就是子field的可选项是依赖它的父field的,这个需求在admin中没有找到配置方法,找到一个插件django-smart-selects

model field options

  • blank=True,实际控制的form的validation,允许表单中该字段为空

  • null=True,控制的DB中字段的属性,null或者not null

控制某条记录的显示

需要在model的定义中加入:

1
2
def __unicode__(self):
	return self.name

否则,记录显示出来的是Python object

在view中显示的model名称的自定义

这个名称默认就是显示的是在代码中定义的model的名称,可以用以下代码来自定义:

1
2
3
class Meta:
	verbose_name = u'商品子类'
	verbose_name_plural = u'商品子类'

自定义app名称

参考这里

多个字段作为一个唯一键

需要在该表对应的model类的Meta类中增加unique_together定义:

1
2
3
4
class Meta:
	unique_together = ('name', 'parent_category', 'sub_category')
	verbose_name = u'商品'
	verbose_name_plural = u'商品'

对显示界面的定制

比如,控制要显示的字段、哪几个字段是可以点击的、显示搜索框、分页等,这些都是可以配置的,不用自己来实现,非常方便。

1
2
3
4
5
6
7
8
class ProductAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'sku', 'barcode', 'price', 'description', 'create_time', 'update_time')
    list_display_links = ('id', 'name')
    exclude = ('sku',)
    search_fields = ('name',)
    list_per_page = 100
    ordering = ['id']
    empty_value_display = '-'

参考:

自定义方法(ModelAdmin methods)

Django的admin提供了一系列的方法,支持你通过重写这些方法来定制它的默认行为,比如save_model方法可以让你自定义入库的操作,加入一些自己的逻辑。它提供了非常多的方法,具体可以看文档,我目前只用到了一个save_model方法。

 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
class ProductAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'sku', 'barcode', 'price', 'description', 'create_time', 'update_time')
    list_display_links = ('id', 'name')
    exclude = ('sku',)
    search_fields = ('name',)
    list_per_page = 100
    ordering = ['id']
    empty_value_display = '-'

    def save_model(self, request, obj, form, change):
        if not change:         # Add
            obj.save()         #  save in order to get the auto increment id
            generate_sku(obj)
            obj.save()         #  save generated sku
        else:                  # Update
#            generate_sku(obj) # sku should not be changed once the record is inserted, even if all the other fields have changed
            obj.save()

def generate_sku(obj):
    id = obj.id
    parent_category = obj.parent_category.code
    sub_category = obj.sub_category.code

    sku_parts = ['XLJ']
    sku_parts.extend([parent_category, sub_category, 'X'])
    today = date.today()
    sku_parts.append(today.strftime('%y%m%d'))
    seq_id = '%06d' % id
    sku_parts.append(seq_id)

    sku = re.sub(r'[^a-zA-Z0-9]', '', ''.join(sku_parts))
    obj.sku = sku

参考: