对于上下文,我正在尝试创建一个允许用户上传有关其自定义口袋妖怪的信息的表单。基本上,它们是可以捕捉,命名和升级的生物。进行比较,它与狗是一个相似的概念。有拉布拉多犬,德国牧羊犬,爱斯基摩犬等,它们是基础Dog模型的变体,但是每个人都有一个名字和其他定义特征。
我已经创建了Pokemon和CustomPokemon模型,并将后者导入到我的form.py文件中。我正在尝试访问一些父字段,但无法:
from django import forms
from .models import CustomPokemon
class PokemonForm(forms.ModelForm):
class Meta:
model = CustomPokemon
fields = ['pokemon.poke_name', 'name', 'level']
poke_name字段是从父Pokemon
模型继承而其他两个字段属于CustomPokemon
模型。我收到此FieldError:
Unknown field(s) (pokemon.poke_name) specified for CustomPokemon.
使用poke_name
无法解决该问题,因此我很好奇如何访问父模型的字段,以便可以在表单中显示它们。
答案 0 :(得分:2)
如果您只想显示一个显示字段poke_name
的下拉列表,则可以在__str__
模型中定义一个Pokemon
方法,如下所示:
class Pokemon(model.Model):
...
def __str__(self):
return self.poke_name
然后,您可以如下定义表格:
class PokemonForm(forms.ModelForm):
class Meta:
model = CustomPokemon
fields = ['pokemon', 'name', 'level']
然后您将看到一个下拉列表,显示数据库的所有poke_name
,您可以在其中选择外键。如果poke_name
是unique
字段会更好,这样可以清楚地标识外键。
如果需要更多自由度,可以按如下所示手动定义自定义字段:
class PokemonForm(forms.ModelForm):
poke_name = forms.CharField()
class Meta:
model = CustomPokemon
fields = ['name', 'level']
然后,在验证表单时,应注意条目是否存在和/或创建它:
if form.is_valid():
form.instance.pokemon = Pokemon.objects.get_or_create(cname=form.cleaned_data['poke_name'])
form.save()