优草派  >   Python

django admin 扩展

王志强            来源:优草派

Django Admin 是一个强大的后台管理系统,它提供了许多功能,如 CRUD 操作、筛选、搜索、排序等等。但是,有时我们需要根据自己的需求来进行扩展,以便更好地满足业务需求。这就是 Django Admin 扩展的重要性。

Django Admin 扩展是指在 Django Admin 中增加新的功能或者修改原有的功能,以适应业务需求。下面将从多个角度分析 Django Admin 扩展。

django admin 扩展

1. 自定义模型管理

Django Admin 的默认模型管理器提供了很多常用的功能,但是对于一些特殊的需求,我们需要自定义模型管理器。Django 提供了自定义模型管理器的接口,我们可以在 admin.py 中定义一个新的 Manager,并将其赋值给模型的 objects 属性。

例如,我们需要过滤出某个用户的所有文章,并且根据发布时间进行排序。我们可以在 models.py 中定义一个新的 Manager:

```

class ArticleManager(models.Manager):

def get_queryset(self):

return super().get_queryset().filter(author=self.request.user).order_by('-pub_date')

```

然后在 admin.py 中将其应用到模型中:

```

@admin.register(Article)

class ArticleAdmin(admin.ModelAdmin):

...

list_display = ('title', 'author', 'pub_date')

list_filter = ('author', 'pub_date')

search_fields = ('title', 'author__username')

ordering = ('-pub_date',)

...

def get_queryset(self, request):

self.request = request

return Article.objects.all().filter(author=request.user).order_by('-pub_date')

```

2. 自定义表单

Django Admin 默认提供了表单验证功能,但是对于一些特殊的需求,我们需要自定义表单。Django 提供了自定义表单的接口,我们可以在 admin.py 中定义一个新的 Form,并将其赋值给模型的 form 属性。

例如,我们需要在创建文章时,将文章的标题转换为大写。我们可以定义一个新的 Form:

```

class ArticleForm(forms.ModelForm):

title = forms.CharField(label='Title', max_length=100)

def clean_title(self):

return self.cleaned_data['title'].upper()

class Meta:

model = Article

fields = '__all__'

```

然后在 admin.py 中将其应用到模型中:

```

@admin.register(Article)

class ArticleAdmin(admin.ModelAdmin):

...

form = ArticleForm

...

```

3. 自定义视图

Django Admin 提供了很多视图,如列表视图、添加视图、编辑视图等等。但是对于一些特殊的需求,我们需要自定义视图。Django 提供了自定义视图的接口,我们可以在 admin.py 中定义一个新的 View,并将其应用到相应的视图中。

例如,我们需要在列表视图中添加一个新的按钮,用于批量删除文章。我们可以定义一个新的 View:

```

class BatchDeleteView(admin.View):

def post(self, request):

ids = request.POST.getlist('_selected_action')

Article.objects.filter(id__in=ids).delete()

return redirect(reverse('admin:blog_article_changelist'))

```

然后在 admin.py 中将其应用到列表视图中:

```

@admin.register(Article)

class ArticleAdmin(admin.ModelAdmin):

...

actions = ['batch_delete']

...

def batch_delete(self, request, queryset):

return BatchDeleteView.as_view()(request)

batch_delete.short_description = 'Batch Delete'

```

【原创声明】凡注明“来源:优草派”的文章,系本站原创,任何单位或个人未经本站书面授权不得转载、链接、转贴或以其他方式复制发表。否则,本站将依法追究其法律责任。
TOP 10
  • 周排行
  • 月排行