如何使用子模型访问表单中的父模型字段?

时间:2020-08-24 17:24:15

标签: django

对于上下文,我正在尝试创建一个允许用户上传有关其自定义口袋妖怪的信息的表单。基本上,它们是可以捕捉,命名和升级的生物。进行比较,它与狗是一个相似的概念。有拉布拉多犬,德国牧羊犬,爱斯基摩犬等,它们是基础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无法解决该问题,因此我很好奇如何访问父模型的字段,以便可以在表单中显示它们。

1 个答案:

答案 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_nameunique字段会更好,这样可以清楚地标识外键。

第二个选项

如果需要更多自由度,可以按如下所示手动定义自定义字段:

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