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

Posted

技术标签:

【中文标题】具有 ForeignKey 字段的模型的 Django ModelForm 无法正确显示 selectBox【英文标题】:Django ModelForm with model having ForeignKey field does not display selectBox correctly 【发布时间】:2018-07-14 03:22:25 【问题描述】:

这可能很容易解决。我创建了一个使用 forms.ModelForm 的表单。 我的模型有 ForeignKey 字段。表单为foreignKey创建了一个选择字段,但没有正确显示值。

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 添加值: sqlite> 插入性别值(1,"Male"); sqlite> 插入性别值(2,“女性”);

【问题讨论】:

定义 __str__Gender 类中返回 self.name 【参考方案1】:

在 Gender 模型中实现 __unicode____str__ 方法,

def __unicode__(self):
    return '%s' % self.name

它会在您的选项中显示性别名称。

如何自定义ForeignKey Model字段的默认表单字段行为

ForeignKey 映射到 ModelChoiceField,您可以覆盖其默认行为。您可以使用“to_field_name”参数覆盖“选择”选项字段值(当您的相关模型中有多个唯一字段时很有用),否则选项字段值默认为 pk 字段。

'empty_label' 将使用 empty_label 属性更改默认的“--------”

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() 方法。

【讨论】:

【参考方案2】:
def__str__(self):
      return self.name

你会在你的性别课上添加这个

【讨论】:

【参考方案3】:

我已经在其他地方给出了这个答案,希望复制粘贴也不错。 就我而言,我不想为我的十亿模型制作一个 str,所以我只是这样做了:

您可以创建一个自定义的 ModelChoiceField,您可以向其传递函数。这样,如果您有不同的字段希望显示不同的属性,则只能有 1 个类:

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 人,但这对我有用。

【讨论】:

以上是关于具有 ForeignKey 字段的模型的 Django ModelForm 无法正确显示 selectBox的主要内容,如果未能解决你的问题,请参考以下文章

django模型在具有外键的字段中没有列错误

Django Admin ForeignKey字段小部件选项和不一致的默认值

Model可以使用两个模型之一的ForeignKey

允许 Django 模型 ForeignKey 字段的表单上的 TextInput

将 Django 模型字段的类型从 CharField 更改为 ForeignKey

基于model的form表单