【问题标题】:How to get Foreign Key ID to show two models in DetailView?如何获取外键 ID 以在 DetailView 中显示两个模型?
【发布时间】:2026-02-06 14:35:01
【问题描述】:

我创建了这两个模型:“财产”和“卧室”。我创建了一个基于类的视图 DetailView 来显示属性的详细信息,但现在我不仅需要显示属性的详细信息,还需要显示卧室的详细信息。

# models.py
class Property(models.Model):
    property_reference = models.CharField(db_column='Property_Reference', max_length=10)  # Field name made lowercase.
    address = models.CharField(db_column='Address', max_length=250, blank=True, null=True)  # Field name made lowercase.
    post_code = models.CharField(db_column='Post_Code', max_length=15, blank=True, null=True)  # Field name made lowercase.
    type = models.CharField(db_column='Type', max_length=25, blank=True, null=True, choices=HOUSE_TYPE_CHOICES)  # Field name made lowercase.
    bedrooms = models.IntegerField(db_column='Bedrooms', blank=True, null=True)  # Field name made lowercase.
    bathrooms = models.IntegerField(db_column='Bathrooms', blank=True, null=True)  # Field name made lowercase.
    usual_cleaning_requirements = models.CharField(db_column='Usual_Cleaning_Requirements', max_length=250, blank=True, null=True)  # Field name made lowercase.
    notes = models.CharField(db_column='Notes', max_length=500, blank=True, null=True)  # Field name made lowercase.
    feature_image = models.ImageField(null=True)

    class Meta:
        db_table = 'Property'

    def __str__(self):
        return self.property_reference

    def get_absolute_url(self):
        return reverse("properties:property_detail",kwargs={'pk':self.pk})


class Bedroom(models.Model):
    type = models.CharField(db_column='Type', choices=BEDROOM_TYPE_CHOICES, max_length=50)
    bed_dimensions = models.CharField(db_column='Bed_Dimension', choices=BED_DIMENSION_CHOICES, max_length=30)
    image = models.ImageField(null=True, blank=True)
    ensuite = models.BooleanField(default=False)
    notes = models.CharField(db_column='Notes', max_length=500, blank=True, null=True)  # Field name made lowercase.
    property = models.ForeignKey(Property, null=False, on_delete=models.CASCADE, related_name='bedroom')

我已经创建了这个视图:

class PropertyDetailView(DetailView):
    template_name = 'properties/property-detail.html'
    model = Property

    def get_context_data(self,**kwargs):
        context = super().get_context_data(**kwargs)
        context['bedrooms'] = Bedroom.objects.get(property = property.property_id)
        return context

我一定是做错了什么,因为我还在学习,你能帮帮我吗?

【问题讨论】:

  • 你根本不需要get_context_data 方法。在模板中,您可以简单地遍历property.bedroom.all
  • 您应该告诉我们出了什么问题。你看到错误了吗?还有什么? @DanielRoseman 是正确的,但您的问题不完整。此外,当使用模型管理器 (Bedroom.objects) 获取多个对象时,您不能使用 get()(用于单个对象),但您应该使用 filter()
  • @DanielRoseman 非常感谢您的帮助!我会在你的帮助下发布一个答案。
  • @dirkgroten 我会在下一个问题中关注这些事情。我得到的 property_id 不存在。谢谢您的帮助。我在 Daniel Roseman 的帮助下解决了我的问题。

标签: django database django-models django-views


【解决方案1】:

我在@Daniel Roseman 的帮助下解决了我的问题。它现在正在工作。

我已经删除了 PropertyDetailView 上的 get_context_data()

#views.py

class PropertyDetailView(DetailView):
    template_name = 'properties/property-detail.html'
    model = Property

我已经在我的 property-detail.html 上迭代了一个 for 循环

    # property-details.html
<tbody>
       {% for bedroom in property.bedroom.all %}
         <tr>
            <td><a href="javascript:void(0)">{{ bedroom.type }}</a></td>
            <td>{{ bedroom.bed_dimensions }}</td>
            <td><span class="text-muted"> {{ bedroom.ensuite }}</span> </td>
            <td>{{ bedroom.notes }}</td>
         </tr>
       {% endfor %}
    </tbody>

【讨论】: