这可能很容易解决。我创建了一个使用forms.ModelForm的表单。 我的模型有ForeignKey字段。 Form为foreignKey创建一个select字段,但是没有正确显示值。
models.py
from django.db import models
# Create your models here.
class Gender(models.Model):
name = models.CharField(max_length=8, null=True)
class Meta:
db_table='gender'
class UserExample(models.Model):
name = models.CharField(max_length=16,null=True)
age = models.IntegerField(blank=True, null=True)
gender = models.ForeignKey('Gender', on_delete=models.SET_NULL, null=True)
class Meta:
db_table='userExample'
def __str__(self):
return ""
forms.py
from django import forms
from .models import UserExample, Gender
class UserForm(forms.ModelForm):
class Meta:
model = UserExample
fields = ('name', 'age', 'gender')
views.py
from django.shortcuts import render
from .forms import UserForm
# Create your views here.
def index(request):
form = UserForm
return render(
request,
'index.html',
{'form': form}
)
urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index, name='index'),
]
的index.html
<html>
<head>
<title>test </title>
</head>
<body>
<form action="formreturn/" method="post">
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
</body>
</html>
我启动应用程序后。在选择框中,我只选择性别对象,但不选择性别名称。
可选我曾经使用sqllite3添加值,如下所示:
源码&GT;插入性别值(1,“男性”);
源码&GT;插入性别价值观(2,“女性”);
答案 0 :(得分:2)
在性别模型中实施__unicode__
或__str__
方法,
def __unicode__(self):
return '%s' % self.name
它会在您的选项中显示性别名称。
如何自定义ForeignKey模型字段的默认表单字段行为
ForeignKey映射到ModelChoiceField,您可以覆盖它的默认行为。您可以使用“to_field_name”参数覆盖“选择”选项字段值(当相关模型中有多个唯一字段时很有用),否则选项字段值默认为pk字段。
'empty_label'将使用empty_label atrribute更改默认的“--------”
forms.py
class UserForm(forms.ModelForm):
gender = forms.ModelChoiceField(queryset=Gender.objects.all(),
to_field_name = 'name',
empty_label="Select Gender")
class Meta:
model = UserExample
fields = ('name', 'age', 'gender')
选项显示名称默认为__str__
方法输出。您可以通过编写自定义选择字段类(继承自ModelChoiceField)并覆盖label_from_instance()方法来覆盖默认行为。
答案 1 :(得分:0)
我已经在另一个地方给出了这个答案,希望复制粘贴也不错。 就我而言,我不想为我的十亿个型号制作 str ,所以我只是这样做了:
您可以创建一个自定义ModelChoiceField,您可以将一个函数传递给该自定义ModelChoiceField。这样,如果您有不同的字段要显示不同的属性,则只能有一个类:
class CustomModelChoiceField(forms.ModelChoiceField):
name_function = staticmethod(lambda obj: obj)
def __init__(self, name_function, *args, **kwargs):
if not name_function is None: self.name_function = name_function
super(CustomModelChoiceField, self).__init__(*args, **kwargs)
def label_from_instance(self, obj):
return self.name_function(obj);
然后您可以像这样简单地调用它:
form_field = CustomModelChoiceField(
lambda obj: obj.get_full_name(),
queryset=Whatever.objects.all(),
)
如果您正在做一些动态的事情,您也可以传递None,并且基本上只是默认的常规ModelChoiceField。我不太喜欢python,但这对我有用。
答案 2 :(得分:-1)
def__str__(self):
return self.name
您将其添加到您的性别班级