python - 使用模板覆盖更改 django 管理列表中的模型对象 url
问题描述
假设我有一个 Category 的模型,并且它已经在 admin.py 中声明了。
我想使用 Django 模板覆盖做两件事。
- 在“添加类别+ ”附近的右侧添加一个按钮,该按钮仅在“类别列表”页面上可见,并将我带到另一个 URL。
- 覆盖 Category 对象的 URL,以便单击列表上的每个单独的类别会转到相应的 URL
# models.py
class Category(models.Model):
name = models.CharField(max_length=50, null=True, blank=False)
LANGUAGE_ENGLISH = 'en'
LANGUAGE_FRENCH = 'fr'
LANGUAGES = ((LANGUAGE_ENGLISH, 'English'),(LANGUAGE_FRENCH, 'French'),)
language = models.CharField(max_length=12, default=LANGUAGE_ENGLISH, choices=LANGUAGES, blank=False)
created_at = models.DateTimeField(auto_now_add=True)
# admin.py
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ('name', 'language', 'created_at')
list_filter = ('created_at', 'language')
search_fields = ('name',)
date_hierarchy = 'created_at'
ordering = ['-created_at']
解决方案
第一个解决方案:
手动覆盖list_display_links
和更改您的字段
这是一个两步的过程。首先,我们需要改变get_list_display_links
默认行为。
查看 django 的文档和源代码,您会发现它最终会使用list_display
. 在您的管理课程中:
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ('name', 'language', 'created_at')
list_filter = ('created_at', 'language')
list_display_links = [] #< With this, you still can add up a link to your original admin
search_fields = ('name',)
date_hierarchy = 'created_at'
ordering = ['-created_at']
def get_list_display_links(self, request, list_display):
"""
Return a sequence containing the fields to be displayed as links
on the changelist. The list_display parameter is the list of fields
returned by get_list_display().
"""
if self.list_display_links or self.list_display_links is None or not list_display:
# We make sure you still add your admin's links if you explicitly declare `list_display_links`
return self.list_display_links
else:
# We return empty list instead of `list_display[:1]`
# if no `list_display_links` is provided.
return []
然后使用这个答案,您可以自定义任何列。
第二种解决方案:
自己处理更改视图
在您的管理课程中:
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
#... same things as you have
def change_view(self, request, object_id, form_url="", extra_context=None):
#Now, you can do pretty much whatever: it's a function based view!
我推荐第一个,因为我相信默认管理员change_view
总是有用的。
推荐阅读
- javascript - 在有条件的情况下使用 mark.js
- arrays - 左/右旋转数组后最长递增子数组的长度
- ionic4 - 运行子进程cordova 时出错。cordova build android 退出,退出代码为 1
- python - 编码调查,找到孔径半径大小
- javascript - onPress 事件在本机反应中不适用于视图、图像、可触摸不透明度
- python - python 3.7中的下标“z”
- html - 悬停背景大于容器
- docker - OCI 运行时创建失败
- javascript - 如何使用 React360 使用 VRbutton 运行两个功能?
- react-native - 我可以在导出功能中使用 this.props.navigation.state.params 吗?