很久没写原创文章了,真对不住大家。今天小编我要带你使用Django开发一个APP,仿链家的二手房信息查询。它只有一个页面,主要功能用于展示二手房信息,并支持访问用户根据关键词或多个筛选条件查询房源信息。是的,你没听错。我们只开发一个页面,只编写一个视图函数,只使用一个模板,然而其实现的筛选查询功能确实非常有用的,可以扩展到其它项目。文末会附上GITHUB源码地址。
我们要实现的最终展示效果如下图所示:
所用到的安装包
Django==3.0.8 # 最新Django版本
django-filter==2.3.0 # 扩展Django的Filter功能
前端使用bootstrap 4。如果你不熟悉django-filter的使用,强烈建议先阅读Django-filter教程详解: 从安装使用到高阶美化分页-大江狗精品
项目开始
先使用pip安装项目所使用到的安装包,然后使用如下命名创建项目(project)和应用(app)。项目名为myhouseproject, app名为house。
django-admin startporject myhouseproject
cd myhouseproject
django-admin startapp house
然后在项目 settings.py 文件的 INSTALLED_APPS 中添加应用名称:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'house',
]
编写模型
进入house文件夹,编写models.py,添加如下代码。Django的ORM会自动根据模型在自带的sqlite数据库中生成数据表。我们的House模型与Community模型是一对多的关系(ForeignKey),因为一个Community(小区)内包含多条House信息。
#house/models.py
from django.db import models
# Create your models here.
class City(models.TextChoices):
BEIJING = 'bj', '北京'
SHANGHAI = 'sh', '上海'
SHENZHEN = 'sz', '深圳'
GUANGZHOU = 'gz', '广州'
HANGZHOU = 'hz', '杭州'
class Bedroom(models.TextChoices):
B1 = '1', '1室1厅'
B2 = '2', '2室1厅'
B3 = '3', '3室1厅'
B4 = '4', '4室2厅'
class Area(models.TextChoices):
A1 = '1', '<50平米'
A2 = '2', '50-70平米'
A3 = '3', '70-90平米'
A4 = '4', '90-140平米'
A5 = '5', '>140平米'
class Floor(models.TextChoices):
LOW = 'l', '低楼层'
MIDDLE = 'm', '中楼层'
HIGH = 'h', '高楼层'
class Direction(models.TextChoices):
EAST = 'e', '东'
SOUTH = 's', '南'
WEST = 'w', '西'
NORTH = 'n', '北'
class Community(models.Model):
name = models.CharField(max_length=60, verbose_name='小区')
city = models.CharField(max_length=2, choices=City.choices, verbose_name="城市")
add_date = models.DateTimeField(auto_now_add=True, verbose_name="发布日期")
mod_date = models.DateTimeField(auto_now=True, verbose_name="修改日期")
class Meta:
verbose_name = "小区"
verbose_name_plural = "小区"
def __str__(self):
return self.name
class House(models.Model):
description = models.CharField(max_length=108, verbose_name="描述")
community = models.ForeignKey('Community', on_delete=models.CASCADE, verbose_name="小区")
bedroom = models.CharField(max_length=1, choices=Bedroom.choices, verbose_name="房型")
direction = models.CharField(max_length=2, choices=Direction.choices, verbose_name="朝向")
floor = models.CharField(max_length=1, choices=Floor.choices, verbose_name="楼层")
area = models.DecimalField(max_digits=8, decimal_places=2, verbose_name="面积(平方米)")
area_class = models.CharField(max_length=1, null=True, blank=True, choices=Area.choices, verbose_name="面积")
price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name="价格(万元)")
add_date = models.DateTimeField(auto_now_add=True, verbose_name="发布日期")
mod_date = models.DateTimeField(auto_now=True, verbose_name="修改日期")
class Meta:
verbose_name = "二手房"
verbose_name_plural = "二手房"
def __str__(self):
return '{}.{}'.format(self.description, self.community)
def save(self, *args, **kwargs):
if self.area < 50:
self.area_class = Area.A1
elif 50 <= self.area < 70:
self.area_class = Area.A2
elif 70 <= self.area < 90:
self.area_class = Area.A3
elif 90 <= self.area < 140:
self.area_class = Area.A4
else:
self.area_class = Area.A5
super().save(*args, **kwargs)
现在进入myhouseproject文件夹,输入如下命令创建House模型对应数据表和超级用户了。
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
之所以我们要创建超级用户admin是因为我们要通过Django自带的后台admin添加房产信息。Django的后台admin虽然不太美观,但功能强大,使我们可以专注于向用户展示信息。
自定义Admin并添加数据
进入house文件夹,编写admin.py,添加如下代码,将House和Community模型在后台注册。
#house/admin.py
from django.contri