簡體   English   中英

具有外鍵字段的模型的 Django ModelForm 無法正確顯示 selectBox

[英]Django ModelForm with model having ForeignKey field does not display selectBox correctly

這可能很容易解決。 我創建了一個使用 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 ""

表格.py

from django import forms

from .models import UserExample, Gender

class UserForm(forms.ModelForm):

    class Meta:
        model = UserExample
        fields = ('name', 'age', 'gender')

視圖.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}
    )

網址.py

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index, name='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,"Female");

在 Gender 模型中實現__unicode____str__方法,

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

它會在您的選項中顯示性別名稱。

如何自定義外鍵模型字段的默認表單字段行為

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')

選項顯示名稱默認為__str__方法輸出。 您可以通過編寫自定義選擇字段類(繼承自 ModelChoiceField)並覆蓋 label_from_instance() 方法來覆蓋默認行為。

def__str__(self):
      return self.name

您將在您的性別類別中添加此內容

我已經在另一個地方給出了這個答案,希望復制粘貼還不錯。 就我而言,我不想為我的十億模型制作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。 我不太喜歡蟒蛇,但這對我有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM