Django如何校验用户认证状态并展示差异化的位置相关内容
原代码问题排查
- 登录状态判断逻辑错误:
User.is_authenticated是用户类的固定属性,永远返回True,无法正确判断当前访客的登录状态,正确用法是调用请求携带的用户实例属性self.request.user.is_authenticated - 上下文注入逻辑缩进错误:
context.update代码块被缩进在else分支内,导致已登录用户的视图上下文不会拿到job_listing数据 - 未明确定义默认坐标的
longitude、latitude变量,运行时会触发未定义变量报错
修正后完整代码
from django.views import generic from django.contrib.gis.geos import Point from django.contrib.gis.db.models.functions import Distance from .models import JobListing # 请替换为你自己的模型导入路径 # 预设默认位置经纬度,可根据业务需求修改,示例为北京坐标 DEFAULT_LONGITUDE = 116.403874 DEFAULT_LATITUDE = 39.914885 class Home(generic.TemplateView): template_name = "Home.html" def get_context_data(self, **kwargs): context = super(Home, self).get_context_data(**kwargs) # 正确判断当前用户登录状态 if self.request.user.is_authenticated: map_location = self.request.user.location_on_the_map else: map_location = Point(DEFAULT_LONGITUDE, DEFAULT_LATITUDE, srid=4326) # 上下文更新逻辑移出分支判断,所有用户都能拿到按距离排序的岗位列表 context.update({ 'job_listing': JobListing.objects.annotate( distance=Distance("location_on_the_map", map_location) ).order_by("distance")[0:6] }) return context
注意事项
请确认你的自定义用户模型中location_on_the_map字段为PointField类型,且SRID参数和默认位置的SRID一致(示例用的是通用GPS坐标SRID=4326),否则距离计算会出现偏差。
内容的提问来源于stack exchange,提问作者spiritman
相关产品推荐
相关产品推荐

