给定另一个模型字段,从不同的Django模型中查找字段

时间:2018-06-25 21:53:06

标签: python django

我在Django中有两个模型:Room用于办公室,Person用于雇员。一个办公室可以有多名员工。我正在尝试制作一个详细视图的html页面,该页面显示一个人的详细信息,例如其姓名和办公室号码。我可以很好地从Person模型中获取详细信息,但是在对Room模型进行反向查找时遇到了麻烦。输入以下代码,如何获得一个人的办公室?

#models.py
class Room(models.Model):
    number = models.CharField('Room number', unique=True)
    persons = models.ManyToManyField('Person', blank=True)
    #...

class Person(models.Model):
    name = models.CharField('Full name', max_length=200)
    #...


#views.py
from django.views import generic
class PersonDetailView(generic.DetailView):
    model = Person


#person_detail.html
{% extends "base_generic.html" %}

{% block content %}

    <h1>Name: {{ person }}</h1>
    <p>Room: {{ Room.number }}</p>


{% endblock %}

当前所做的只是返回一个名称,但“房间”留为空白。

1 个答案:

答案 0 :(得分:1)

您可以重载get_context_data方法

class PersonDetailView(DetailView):
model = Person
context_object_name = 'person'
template_name = 'person_detail.html'

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    # woops, typo
    # context['room'] = Room.objects.filter(person=context['object']).first()
    context['room'] = Room.objects.filter(persons=context['object']).first()
    return context

和模板:

#person_detail.html
{% extends "base_generic.html" %}

{% block content %}

    <h1>Name: {{ person }}</h1>
    <p>Room: {{ room.number }}</p>


{% endblock content %}

编辑: 但是,Person指向models.ForeignKey的{​​{1}}可能会更好,因此Room只能有一个Person,但可以有许多{{1 }}可以具有相同的Room

然后您可以保留原始视图并更改模板:

Person