首页 > 解决方案 > Django:尝试反转模型的 __str__() 函数

问题描述

我想要一个可以与模型函数相反的__str__函数。例如我有:

模型

class DepartmentModel(models.Model):
    department_name = models.CharField(max_length=100)
    department_description = models.CharField(max_length=500)

    def __str__(self):
        return self.department_name

作为自定义字段的一部分,TypedModelListField我需要将模型字符串表示形式转换为对象(如果存在)。

说我有<DepartmentModel: Finance>一个叫做__str__()返回的对象"Finance"

如果可能,我想采用字符串"Finance"并具有反转__str__()函数以返回对象的<DepartmentModel: Finance>效果。

形式

class AddDepartment(forms.Form):

    user = CustomFields.TypedModelListField(
                        queryset=DepartmentModel.objects.all())

自定义字段

class TypedModelListField(forms.ModelChoiceField):

    def to_python(self, value):
        if value == '' or value == None:
            raise forms.ValidationError('Entry cannot be empty')
        
        #####################################################################
        ### HERE I WANT TO TRY AND CONVERT __STR__ REPRESENTATION to OBJ  ###
        #####################################################################

        value = super().to_python(value)
        return value

class ListTextWidget(forms.TextInput):
    def __init__(self, dataset, name, *args, **kwargs):
        super().__init__(*args)
        self._name = name
        self._list = dataset
        self.attrs.update({'list':'list__%s' % self._name,'style': 'width:100px;'})
        if 'width' in kwargs:
            width = kwargs['width']
            self.attrs.update({'style': 'width:{}px;'.format(width)})
        if 'identifier' in kwargs:
            self.attrs.update({'id':kwargs['identifier']})

    def render(self, name, value, attrs=None, renderer=None):
        text_html = super().render(name, value, attrs=attrs)
        data_list = '<datalist id="list__%s">' % self._name
        for item in self._list:
            data_list += '<option value="%s">' % item
        data_list += '</datalist>'
        return (text_html + data_list)

我必须补充一点,我希望它是动态的,因此无论模型如何,都可以重新应用自定义字段。例如我可以写(在to_python函数中):

try:
    value = DepartmentModel.objects.get(department_name=value)
except:
    raise forms.ValidationError('Department does not exist')

但这对于模型和department_name查询中使用的模型是明确的。

标签: pythondjangodjango-modelsdjango-forms

解决方案


推荐阅读