我正在尝试在 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)
但是数据库显示“对象(1)”与其余字段一起插入。这应该是从选择标签中提取的序列号。
有任何关于为什么会发生这种情况的提示吗?
第三张图片(数据库图片)的来源并不明显,但
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>)
的结果。