![](/img/trans.png)
[英]How to display a ForeignKey field in a ModelForm with no default value?
[英]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.