在Django Admin面板中,ForeignKey关联后显示ChoiceField而非CharField
Django ForeignKey在Admin显示ChoiceField而非CharField的解决方法
问题说明
在Django中使用ForeignKey创建多对一关系时,Django Admin面板中对应字段默认显示为ChoiceField下拉选择框,但需求是显示为CharField输入框。
相关截图说明
- 模型截图:展示了包含ForeignKey关联字段的模型定义内容
- Django Admin面板截图:展示了Admin页面中该字段以下拉选择框形式呈现的效果
附带代码(views.py)
from django.http import JsonResponse from .models import Name def names_list(request): MAX_OBJECTS = 1 name = Name.objects.all() data = {"results": list(name.values("Name"))} return JsonResponse(data)
解决方案
ForeignKey在Django Admin中默认用下拉选择框关联对象,若要改为CharField输入框,可通过以下两种方式实现:
方式一:自定义ModelForm替换字段并添加验证
- 在应用目录下创建
forms.py,定义自定义表单:
from django import forms from .models import Name, 你的目标模型 class 目标模型表单(forms.ModelForm): # 将ForeignKey字段替换为CharField,label为字段显示名称 name = forms.CharField(label="关联名称") class Meta: model = 你的目标模型 fields = '__all__' def clean_name(self): # 验证输入的名称是否存在于关联模型中 input_name = self.cleaned_data.get('name') try: Name.objects.get(Name=input_name) except Name.DoesNotExist: raise forms.ValidationError("输入的名称不存在于关联数据中") return input_name
- 在
admin.py中注册模型时使用该表单:
from django.contrib import admin from .models import 你的目标模型 from .forms import 目标模型表单 class 目标模型Admin(admin.ModelAdmin): form = 目标模型表单 admin.site.register(你的目标模型, 目标模型Admin)
方式二:使用raw_id_fields显示ID输入框
如果只需输入关联对象的ID而非名称,可直接在Admin配置中使用raw_id_fields,字段会显示为输入框:
from django.contrib import admin from .models import 你的目标模型 class 目标模型Admin(admin.ModelAdmin): raw_id_fields = ('name',) admin.site.register(你的目标模型, 目标模型Admin)
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

