所以我正在使用 Django 构建一个网站,其中
Property
有一个 agent
列出它,在 AgentDetailView
中我正在渲染所有代理的信息,但我也想在同一页面中渲染代理列出的属性。所以我尝试了Property.objects.filter
方法但没有成功。
如何让我的代码正常工作?预先感谢!
我的模型.py:
class Property(models.Model):
price = models.IntegerField()
address = models.CharField(max_length = 10000)
state = models.CharField(max_length = 1000)
country = models.CharField(max_length = 1000)
description = models.TextField()
image1 = models.ImageField(upload_to = 'Images/')
image2 = models.ImageField(upload_to = 'Images/')
image3 = models.ImageField(upload_to = 'Images/')
agent = models.ForeignKey(Agent, on_delete=models.CASCADE)
agent_description = models.TextField()
is_featured = models.BooleanField(default = False)
bedrooms = models.IntegerField()
bathrooms = models.IntegerField()
date_posted = models.DateTimeField(default=timezone.now)
slug = models.SlugField(default='')
class Agent(models.Model):
name = models.CharField(max_length=100)
password = models.CharField(max_length=100)
image = models.ImageField(upload_to = 'Images/')
bio = models.TextField()
instagram = models.URLField(max_length=100)
twitter = models.URLField(max_length=100)
facebook = models.URLField(max_length=100)
linkedin = models.URLField(max_length=100)
is_featured = models.BooleanField(default = False)
slug = models.SlugField(default='')
我的观点.py:
class AgentDetailView(DetailView):
model = Agent
template_name = 'blog/agent_detail.html'
slug_field = 'slug'
def get_queryset(self):
return Property.objects.filter(agent=self.kwargs.get('agent'))
我认为你的
get_queryset
方法有问题。 agent
模型中的Property
字段是Agent
模型的外键,因此您应该根据特定的代理实例而不是代理slug来过滤属性。
尝试:
from django.shortcuts import get_object_or_404
class AgentDetailView(DetailView):
model = Agent
template_name = 'blog/agent_detail.html'
slug_field = 'slug'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
agent = self.get_object()
properties = Property.objects.filter(agent=agent)
context['properties'] = properties
return context
get_context_data
方法用于向模板添加额外的上下文数据。它使用 self.get_object()
检索特定代理实例,然后根据该代理过滤属性。
现在,在您的
agent_detail.html
模板中,您可以使用 {{ agent.field_name }}
访问代理详细信息,并使用 for 循环访问属性,例如:
<!-- Display agent details -->
<h1>{{ agent.name }}</h1>
<p>{{ agent.bio }}</p>
<!-- Display properties listed by the agent -->
<h2>Listed Properties:</h2>
<ul>
{% for property in properties %}
<li>{{ property.address }} - {{ property.price }}</li>
{% endfor %}
</ul>