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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:54:03