具有外键字段的模型的 Django ModelForm 无法正确显示 selectBox

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");

Saj*_*ier 7

性别模型中的实现__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() 方法来覆盖默认行为。