如何以Django模型形式添加自定义字段?

时间:2018-08-22 15:20:03

标签: python django django-forms django-admin

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

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

但是,只要用户没有编辑权限,就会收到错误消息。如果用户仅具有查看权限,则会引发此错误:

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',
    )

2 个答案:

答案 0 :(得分: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)

这对您有用吗?

答案 1 :(得分:1)

仅当我尝试打开没有编辑权限(即具有只读权限)的文件夹实例时,才会发生错误。因此,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参数传递的标签。