主要是一些定制的问题,其实django admin已经集成的非常好了,该有的都有了,一般开箱即用就行了。
如果你对Django Admin不熟悉的话,这里有一篇很好的介绍。
dependent select fields
其实就是子field的可选项是依赖它的父field的,这个需求在admin中没有找到配置方法,找到一个插件django-smart-selects
model field options
控制某条记录的显示
需要在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
|
参考: