如何仅在更改视图中显示自定义字段(admin)

 大好 发布于 2023-02-12 15:52

我是Python和Django的新手:)我需要一些帮助.

我想做的事:

我有一个模型页面,我需要在有人尝试更新一个对象时添加自定义字段"消息".

为什么?因为我正在建立一个修订系统.这个领域,它只是对变化的解释.所以这个字段没有链接到Page(但是链接到另一个模型PageRevision)

经过一些研究,我设法将此字段添加到admin.py文件中的表单,如下所示:

class PageAdminForm(forms.ModelForm):
    # custom field not backed by database
    message = forms.CharField(required=False)

    class Meta:
        model = Page

它的工作,我的领域现在显示...但我不希望这个领域到处都是.就在有人试图更新Page对象时.我发现这个答案不同的字段为添加和更改页面在管理员,但它不适合我,因为它是一个自定义字段(我认为).

我在admin.py中的其余代码:

class PageAdmin(admin.ModelAdmin):
    form = PageAdminForm
    fields = ["title", "weight", "description", "message"]
    list_display = ["title", "weight", "description"]
    list_filter = ["updated_at"]

    def get_form(self, request, obj=None, **kwargs):
        if obj is None:
            # not working ?
            kwargs['exclude'] = ['message']
        # else:
        #     kwargs['exclude'] = ['message']
        return super(PageAdmin, self).get_form(request, obj, **kwargs)

    def save_model(self, request, obj, form, change):
        if not obj.id:
            obj.author = request.user
        obj.modified_by = request.user
        wiki_page = obj.save()

        # save page in revision table
        revision = PageRevision(change=change, obj=wiki_page,
                            request=request)
        # retrieve value in the custom field
        revision.message = form.cleaned_data['message']
        revision.save()

def get_form不排除我的自定义消息字段,因为我认为它不知道是否存在.如果我把另一个像标题的字段,它的工作原理.那么如何从添加视图中排除自定义字段?

谢谢 :)

1 个回答
  • 你是对的,它不会这样工作,因为'message'不是在Page模型上找到的字段,ModelAdmin类将忽略排除.您可以通过多种方式实现这一目标,但我认为最好的方法是:

    class PageAdmin(admin.ModelAmin):
        change_form = PageAdminForm
    
        ...
    
        def get_form(self, request, obj=None, **kwargs):
           if obj is not None:
              kwargs['form'] = self.change_form
    
           return super(UserAdmin, self).get_form(request, obj, **defaults)
    

    Basicaly这里django将在编辑页面时添加页面和自定义表单时使用自动生成的ModelForm.Django本身使用类似的技术在添加和更改用户时显示不同的表单:

    https://github.com/django/django/blob/stable/1.6.x/django/contrib/auth/admin.py(有趣的部分在第68行)

    2023-02-12 15:55 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有