K.I*_*.I. 1 python forms django foreign-keys
这可能很容易解决。我创建了一个使用 forms.ModelForm 的表单。我的模型有 ForeignKey 字段。表单为外键创建了一个选择字段,但没有正确显示值。
模型.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 ""
Run Code Online (Sandbox Code Playgroud)
表格.py
from django import forms
from .models import UserExample, Gender
class UserForm(forms.ModelForm):
class Meta:
model = UserExample
fields = ('name', 'age', 'gender')
Run Code Online (Sandbox Code Playgroud)
视图.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}
)
Run Code Online (Sandbox Code Playgroud)
网址.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index, name='index'),
]
Run Code Online (Sandbox Code Playgroud)
索引.html
<html>
<head>
<title>test </title>
</head>
<body>
<form action="formreturn/" method="post">
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
在我启动我的应用程序之后。在选择框中,我只能选择性别对象,而不能选择性别名称。
可选我曾经使用 sqllite3 添加值,如下所示:
sqlite> insert into sex values(1,"Male");
sqlite> 插入性别值(2,"Female");
性别模型中的实现__unicode__
或__str__
方法,
def __unicode__(self):
return '%s' % self.name
Run Code Online (Sandbox Code Playgroud)
它会在您的选项中显示性别名称。
如何自定义外键模型字段的默认表单字段行为
ForeignKey 映射到 ModelChoiceField,您可以覆盖相同的默认行为。您可以使用 'to_field_name' 参数覆盖 'Select' 选项字段值(当相关模型中有多个唯一字段时很有用),否则选项字段值默认为 pk 字段。
'empty_label' 将使用 empty_label 属性更改默认的“--------”
表格.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')
Run Code Online (Sandbox Code Playgroud)
选项显示名称默认为__str__
方法输出。您可以通过编写自定义选择字段类(继承自 ModelChoiceField)并覆盖 label_from_instance() 方法来覆盖默认行为。