为了账号安全,请及时绑定邮箱和手机立即绑定

使用模板覆盖更改 django 管理列表中的模型对象 url

使用模板覆盖更改 django 管理列表中的模型对象 url

郎朗坤 2022-06-28 10:27:35
假设我有一个 Category 的模型,并且它已经在 admin.py 中声明了。我想使用 Django 模板覆盖做两件事。在“添加类别+ ”附近的右侧添加一个按钮,该按钮仅在“类别列表”页面上可见,并将我带到另一个 URL。覆盖 Category 对象的 URL,以便单击列表上的每个单独的类别会转到相应的 URL# models.pyclass 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']管理面板中的类别 在这里,单击 Lifestyle 或 Travel 应该会将我带到两个外部 URL。
查看完整描述

1 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

第一个解决方案:

手动覆盖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总是有用的。


查看完整回答
反对 回复 2022-06-28
  • 1 回答
  • 0 关注
  • 200 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号