关系选择¶小部件显示文本

relationship choices¶widget showing text

我想在我的 Test_Objekt 模特表格中显示 Test_Baustoff->艺术模特的选择。

现在我正在尝试用一个Widget来解决它...

型号:

class Test_Objekt(models.Model):
   baustoffid = models.ForeignKey(Test_Baustoff, on_delete=models.CASCADE)
   bezeichnung = models.CharField(max_length=100, default='', blank=True)

class Test_Baustoff(models.Model):
   art = models.CharField(max_length=100)
   wert = models.IntegerField(default='0')

表单:(在 django 文档中找到这段代码...不知道我是否以正确的方式使用它??)

class BaustoffidSelect(forms.Select):
    def create_option(self, name, value, label, selected, index, subindex=None, attrs=None):
        option = super().create_option(name, value, label, selected, index, subindex, attrs)
        if value:
            option['attrs']['data-art'] = value.instance.art
        return option

class ObjektForm(forms.ModelForm):

        class Meta:
        model = Test_Objekt
        fields = ['bezeichnung', 'baustoffid', 'bauweiseid', 'dickeaussenwand', 'dickedaemmung', 'fensterqualitaet']
        labels = {'bezeichnung': 'Objekt-Bez'}
        widgets = {'baustoffid': BaustoffidSelect}

html 模板:

    <table class="table table-bordered table-light">
        {{objekt_form.as_table}}
    </table>

目前,我没有找到解决问题的方法。我看了一些教程或 Whosebug 问题,但到目前为止什么都没有。

你对这种处理有什么想法吗?

尝试添加具有模型对象实例的元组列表:

Baustoff_choices = []
for i in Test_Baustoff.objects.all():
    Baustoff_choices.append(
        (i.id,i.art)
    ) #second element is what is this what will be displayed in template

然后在你的 forms.ModelForm:

baustoffid = forms.ChoiceField(choices=Baustoff_choices)

哦,非常感谢。这适用于 id!

我已经在尝试这种方法,但犯了一个错误,我想将其应用到我的 模型中 ...我不知道我还可以添加一个额外的字段到我的 forms.modelform

我在问自己。 是否也可以不保存 id 而保存 foreykn 键对象

喜欢模特:

  #baustoffid = models.ForeignKey(Test_Baustoff, on_delete=models.CASCADE)

形式为:

for i in Test_Baustoff.objects.all():
    Baustoff_choices.append(
        (**i**, i.art) # or somithing like **i.instance**
    ) 

但我得到: 无法分配“'Test_Bauweise object (2)'”:“Test_Objekt.bauweiseid”必须是“Test_Bauweise”实例。

亲切的问候!

已解决。 错过了在我的 models.py 中添加此功能 所以它像“Object(1)”一样令人讨厌...

def __str__(self): return self.art