Django - 仅在模型中提供部分外键

Django - Feeding only part of Foreignkey in models

我是 django 的新手,我想做一个练习 "home expenses"。 我已经做了简单的模型和形式: (来自模型)

#models.py
#these are the type (groceries/clothes/etc. )
class TypWydatku(models.Model):
    typ_wydatku = models.CharField(max_length=25)
    data_wpisu=models.DateField(auto_now_add=True)

#these are the actual input with dates/prices/etc
class Wpisy(models.Model):
    data_zakupu=models.DateField(default=timezone.now())
    data_wpisu=models.DateField(auto_now=True)
    typ_wydatku=models.ForeignKey(TypWydatku)
    kwota=models.FloatField('kwota')
    uwagi=models.CharField(max_length=255, blank=True)

但现在我想添加另一个型号,它将更具体地描述与我的汽车相关的费用。所以我添加了另一个 TypWydatku - Moto with id=3

下一步是创建具有额外字段(里程/油箱)的新模型:

#models.py 
(...)
class WpisyMoto(models.Model):
   wpis=models.ForeignKey(Wpisy)
   przebieg=models.IntegerField()
   uwagi=models.CharField(max_length=200)
   litry=models.FloatField()
   #and more

我现在拥有最简单的表格 :

# forms.py
class TypWydatkuForm(ModelForm):
    class Meta:
        model = TypWydatku
        fields = '__all__'


class WpisyForm(ModelForm):
    class Meta:
        model = Wpisy
        fields = '__all__'

class WpisyMotoForm(ModelForm):
    class Meta:
        model = WpisyMoto
        fields = '__all__'

我想在模板中有选择字段 'wpis',我只想在其中看到那些有 'typ_wydatku'=3 的字段。我应该怎么做?

来自 docs 的 ModelChoiceField 字段(这是 Django 将用来表示 ForeignKey 字段的表单字段类型),这可以通过设置表单字段的 queryset 属性来实现:

class WpisyMotoForm(ModelForm):

    class Meta:
        model = WpisyMoto
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super(WpisyMotoForm, self).__init__(*args, **kwargs)
        self.fields["wpis"].queryset = Wpisy.objects.filter(typ_wydatku__pk=3)