Django为模型表单返回两个单独的__str__

时间:2017-12-04 17:58:18

标签: python django python-3.x django-models django-forms

我有一个Task模型,其中包含任务和实体的外键:

class Task(models.Model):
    task = models.CharField(max_length=500)
    entity = models.ForeignKey(Entity)

我有一个与Task中的一个外键相关的模型:

class Entity(models.Model):
    entity = models.CharField(max_length=50)
    type = models.CharField(max_length=50)
    def __str__(self):
        return self.entity

Task被放入模型表格中:

class TaskForm(ModelForm):
    class Meta:
        model = Task
        fields = [
            'task',
            'entity'
        ]

模型表单显示在模板中,如下所示:

{{ form.task }}
{{ form.instance.entity }}

我如何包含{{ form.instance.type }}的等价物?这将涉及以某种方式在同一模型形式中包括两个__str__表示。我已经看到label_from_instance用于覆盖模型表单,但这看起来只适用于ModelChoiceFields。此外,它会将字段呈现为窗口小部件而不是文本(如form.instance)。

2 个答案:

答案 0 :(得分:1)

在模板中,form.instance.entity是实例的相关entity。如果要显示type字段,只需使用:

{{ form.instance.entity.type }}

要回答标题中的问题,每个模型只能有一个__str__方法。您可以定义另一个返回字符串的方法或属性,但如果您只想显示type字段,则无需执行此操作。

答案 1 :(得分:1)

Django中的模型只是类。您还可以在type类中为Task创建属性。

class Task(models.Mode):
    ... your code ...

    @property
    def entity_type(self):
        return '{}'.format(self.entity.type)

然后您在模板中调用{{ form.instance.entity_type }}

在这种情况下,这有点过分,但在更复杂的情况下可能是一种选择。