Django多对多显示值,而不是对象

Ada*_*dam 2 django django-models django-views

我正在使用 Django 1.3,有以下 2 个模型:

class Person(models.Model):
    name = models.CharField(max_length=500)
    def __unicode__(self):
        return self.name

class Trial(models.Model):
    person = models.ManyToManyField(Person, blank=True)
    strId = str(id)
    def __unicode__(self):
        return self.strId
Run Code Online (Sandbox Code Playgroud)

我试图将“名称”的所有条目显示到视图中,但我目前只返回 <django.db.models.fields.related.ReverseManyRelatedObjectsDescriptor 对象在 0x1019b45d0>

我只有在查看页面源时才能看到。否则它看起来就像一个空白的白色屏幕。

观点如下:

def trial_entry(request, trial):
    currentTrial = Trial.objects.get(id = 1)
    personName = Trial.person
    return HttpResponse(personName)
Run Code Online (Sandbox Code Playgroud)

我显然在这里返回了错误的东西,但我已经寻找了另一种方法来做到这一点,但我发现似乎没有任何效果。这是我发现返回错误以外的任何内容的唯一方法,所以我认为这是最好的发布方式。

非常感谢

Bar*_*tek 5

这里有几个错误。首先,personName不是访问 的任何实际实例Trial,而只是获取有关类中person属性的信息Trial

所以你需要做的第一件事就是改变你获取人的方式。

currentTrial = Trial.objects.get(pk=1)
personName = currentTrial.person
Run Code Online (Sandbox Code Playgroud)

你看有什么不同吗?我在此视图中访问currentTrial,它是Trial您正在处理的类的实例。到目前为止有意义吗?

现在,currentTrial.person实际上是一个 ManyToMany 管理器,可以迭代通过,因为我们可以有很多人在 Trial 上。因此,我们应该调整变量名称以使其更有意义。

persons = currentTrial.person.all()
Run Code Online (Sandbox Code Playgroud)

您可以更进一步,简单地发送currentTrial到模板上下文,然后像这样访问模板中的试验人员:

{% for person in currentTrial.person.all %}
      {{ person }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

希望有帮助!