Django - 修改后的管理表单返回对象而不是文本

问题描述 投票:0回答:1

我正在尝试在 Django 站点上自定义管理表单,以便将其中一个字段从文本字段更改为通过从位置表中获取所有序列号(每个序列号都有一个唯一的编号)来预先填充的选择小部件.

表格.py

class SglnModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.sgln + ":" + obj.name

class EndpointForm(forms.ModelForm): 
    sgln = SglnModelChoiceField(
        queryset=Location.objects.all(),
        to_field_name="sgln",
        label="Endpoint SGLN",
        required=True,
    )
    login = forms.CharField(label='Endpoint Login', max_length=32, required=True)
    password = forms.CharField(label='Endpoint Password', max_length=32, required=True)

管理员.py


from django.contrib import admin
from .forms import EndpointForm
from .models import Endpoints

class EndpointAdmin(admin.ModelAdmin):
    form = EndpointForm

admin.site.register(Endpoints, EndpointAdmin)

表格看起来不错: Django Admin Form

HTML 看起来不错: [HTML图片](https://i.stack.imgur.com/n4eqG.png)

但是数据库显示“对象(1)”与其余字段一起插入。这应该是从选择标签中提取的序列号。 Database row

有任何关于为什么会发生这种情况的提示吗?

python django django-models django-forms django-admin
1个回答
0
投票

第三张图片(数据库图片)的来源并不明显,但

Class object (id)
是 Django 用于表示 Model 实例的默认格式。

如果您想要更改,您可以重写

__str__
类的
Model
方法。

作为示例,您的

Location
类可能如下所示:

class Location(models.Model):
    # Some fields including sgln and name

    def __str__(self):
        return self.sgln + ":" + self.name

现在,如果您尝试打印

Location
模型的实例,它将打印
self.sgln + ":" + self.name
而不是
Location object (<id>)
的结果。

© www.soinside.com 2019 - 2024. All rights reserved.