You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django用户个人资料中展示用户发布的房源信息

嘿,别慌!作为刚接触Django的开发者,遇到这种展示用户关联数据的问题太正常了,我来一步步带你搞定在个人资料页展示用户发布房源的需求~

1. 先确认房源模型和用户的关联(models.py)

首先得确保你的房源模型和Django用户模型正确绑定,这样才能准确筛选出当前用户发布的房源。假设你的房源模型叫Listing,修改后的代码如下:

from django.db import models
from django.contrib.auth.models import User

class Listing(models.Model):
    title = models.CharField(max_length=200)  # 房源标题
    description = models.TextField()          # 房源描述
    price = models.DecimalField(max_digits=10, decimal_places=2)  # 租金
    # 关键字段:关联到发布房源的用户,on_delete=models.CASCADE表示用户删除后其房源也会被删除
    # related_name="listings" 方便后续通过user.listings直接获取用户的所有房源
    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name="listings")
    created_at = models.DateTimeField(auto_now_add=True)  # 发布时间

    def __str__(self):
        return self.title  # 后台显示房源标题,方便管理

如果你用的是自定义用户模型,记得把from django.contrib.auth.models import User替换成你自己的用户模型导入,比如from .models import CustomUser,同时外键字段改成owner = models.ForeignKey(CustomUser, ...)。

2. 在视图中筛选用户的房源(views.py)

接下来要在个人资料的视图里,获取当前登录用户发布的所有房源,再传递给模板渲染。这里给你两种常用视图的写法:

函数视图示例

适合简单的场景,用装饰器确保用户登录后才能访问:

from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from .models import Listing

@login_required  # 未登录用户会自动跳转到登录页
def profile(request):
    # 筛选当前用户的房源,并按发布时间倒序排列(最新的在前)
    user_listings = Listing.objects.filter(owner=request.user).order_by('-created_at')
    # 把用户信息和房源数据传给模板
    context = {
        'current_user': request.user,
        'user_listings': user_listings
    }
    return render(request, 'profile.html', context)

类视图示例(DetailView)

如果你的项目更偏向使用类视图,用Mixin确保登录:

from django.views.generic import DetailView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.models import User
from .models import Listing

class ProfileView(LoginRequiredMixin, DetailView):
    model = User
    template_name = 'profile.html'
    context_object_name = 'current_user'  # 模板中用这个变量名调用用户信息

    def get_context_data(self, **kwargs):
        # 重写方法,额外添加用户的房源数据到上下文
        context = super().get_context_data(**kwargs)
        target_user = self.get_object()  # 获取当前访问的用户对象
        context['user_listings'] = Listing.objects.filter(owner=target_user).order_by('-created_at')
        return context
3. 配置URL路由(urls.py)

在你的app的urls.py里,把个人资料的路径映射到对应的视图:

from django.urls import path
from . import views

urlpatterns = [
    # 函数视图的路由
    path('profile/', views.profile, name='profile'),
    # 类视图的路由(如果用类视图的话,需要传递用户ID或用户名)
    # path('profile/<int:pk>/', views.ProfileView.as_view(), name='profile'),
]

如果用类视图的<int:pk>,表示通过用户ID访问个人资料;如果想用用户名,可以改成<str:username>,记得同步调整视图里的查询逻辑。

4. 在模板中渲染房源(profile.html)

最后在个人资料模板里,循环展示用户的房源:

<h2>我的发布房源</h2>
{% if user_listings %}
    <div class="listing-grid">
        {% for listing in user_listings %}
            <div class="listing-card">
                <h3>{{ listing.title }}</h3>
                <p class="price">¥{{ listing.price }}/月</p>
                <p class="desc">{{ listing.description|truncatewords:20 }}</p>
                <!-- 可以添加编辑、删除房源的链接,根据你的需求配置对应的视图和URL -->
                <a href="{% url 'edit_listing' listing.id %}" class="btn">编辑房源</a>
                <a href="{% url 'delete_listing' listing.id %}" class="btn btn-danger">删除房源</a>
            </div>
        {% endfor %}
    </div>
{% else %}
    <p>你还没有发布任何房源,<a href="{% url 'create_listing' %}">点击这里发布第一个房源吧</a>!</p>
{% endif %}
小提示
  • 测试前记得先创建一个用户,发布几条房源数据,再访问个人资料页验证效果
  • 如果遇到权限问题,检查@login_required或LoginRequiredMixin是否正确配置
  • 可以根据需求添加筛选条件,比如只展示未下架的房源(如果有is_active字段的话)

内容的提问来源于stack exchange,提问作者Gabbywells

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:00:26