【问题标题】:How to add a custom field in django model form?如何在 django 模型表单中添加自定义字段?
【发布时间】:2019-01-28 21:44:57
【问题描述】:

我正在尝试在表单中添加只读字段。

模型Folder 已在管理站点注册。 FolderAdminForm 定义自定义字段 statisticsFolder 模型中没有 statistcs 字段,我只想在表单上放置一些只读数据。此数据在模板中定义。

但每当用户没有编辑权限时,我都会收到错误消息。如果用户只有查看权限,则会出现此错误:

AttributeError: Unable to lookup 'statistics' on Folder or FolderAdmin

这是我的代码:

class CustomWidget(forms.Textarea):
    template_name = 'widget.html'


class FolderAdminForm(forms.ModelForm):
    class Meta:
        model = Folder
        fields = ('field1', 'field2', 'field3',)

    statistics = forms.Field(
        widget=CustomWidget,
        label='Estatísticas',
        help_text='Estatísticas da pasta',
    )

【问题讨论】:

  • 请发布您的FolderAdmin 课程。

标签: python django django-forms django-admin


【解决方案1】:

根据this answer的最后一部分,您可以尝试覆盖表单__init__()方法并分配字段initial属性。

这可能看起来像:

def __init__(self, *args, **kwargs):
        # only change attributes if an instance is passed            
        instance = kwargs.get('instance')
        if instance:
            self.base_fields['statistics'].initial = 'something'
        super().__init__(*args, **kwargs)

这对你有用吗?

【讨论】:

    【解决方案2】:

    该错误仅在我尝试打开没有编辑权限(即只读权限)的文件夹实例时发生。因此,django 将统计字段视为只读字段,然后为该字段搜索标签。 Django 在 Model、ModelAdmin 中寻找这个标签。由于它们都没有“统计”属性,因此会引发错误。 所以,这对我有用:

     class FolderAdminForm(forms.ModelForm):
        class Meta:
            model = Folder
            fields = ('field1', 'field2', 'field3',)
    
            labels = {'statistics': 'Estatísticas'}
    
        statistics = forms.Field(
            widget=CustomWidget,
            label='Estatísticas',
            help_text='Estatísticas da pasta',
        )
    

    因此,每当 django 查找统计标签时,它都会找到该标签并且不会引发错误。我不知道为什么它不能识别作为 Field 参数传递的标签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-11
      • 2020-05-29
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 2015-06-13
      相关资源
      最近更新 更多