【问题标题】:Django Return Two Separate __str__ for a Model FormDjango 为模型表单返回两个单独的 __str__
【发布时间】:2018-05-18 06:24:09
【问题描述】:

我有一个 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)。

【问题讨论】:

  • 你想要{{ form.instance.entity.type }}吗?

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


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    在模板中,form.instance.entity 是实例的相关entity。如果你想显示type字段,你可以简单地使用:

    {{ form.instance.entity.type }}
    

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

    【讨论】:

    • 哇。我觉得我应该继续删除这个问题...谢谢,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 2021-02-11
    • 2011-07-28
    • 1970-01-01
    相关资源
    最近更新 更多