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

Django页面启动时JS函数未触发,客户Logo无法加载求助

问题排查与修复方案

一、JavaScript 函数未执行的核心原因

你的JS代码里使用了log('TEST'),但浏览器原生API中不存在全局的log()方法,正确调用应为console.log()。这个错误会直接导致JavaScript代码终止执行,get_company_logo()函数根本无法完成调用,自然不会触发AJAX请求,也不会有任何日志输出。

修复后的JS代码:

$(document).ready(function () {
  function get_company_logo() {
    console.log('TEST'); // 替换log为console.log

    $.ajax({
      url: '/get/company_logo/',
      method: 'GET',
      success: function (data) {
        create_image(data['logo']); // 无需return,直接调用函数
      },
      error: function (xhr, status, error) {
        console.log('HERE IS THE ERROR!!!', error); // 增加错误详情打印
        console.log('HTTP状态:', status);
        console.log('响应内容:', xhr.responseText);
      },
    })
  }

  function create_image(logo) {
    const logoElement = document.getElementById("logo");
    if (logoElement && logo) { // 增加空值判断,避免无效赋值
      logoElement.src = logo;
    }
  }

  get_company_logo();
});

额外检查:确保页面正确引入了jQuery,如果未引入,$(document).ready会报错$ is not defined,导致整个JS块失效。


二、Django视图函数的问题

1. Client查询未被异常捕获

Client.objects.get(user=request.user)代码在try块外部,若当前登录用户没有对应的Client实例,会直接抛出DoesNotExist异常,返回500错误,无法进入后续异常处理逻辑。

2. Logo URL拼接错误

client.customer.first().logo.url本身已经包含settings.MEDIA_URL(Django的FileField/ImageField的url属性会自动拼接媒体路径),额外添加settings.MEDIA_URL会导致URL重复(比如变成/media/logo.png/media/),最终图片路径无效。

修复后的视图函数:

from django.http import JsonResponse
from django.shortcuts import get_object_or_404
from django.contrib.auth.decorators import login_required
from .models import Client

@login_required  # 强制用户登录后才能访问
def view_company_logo(request):
    print("GETTING LOGO")
    logo = ""
    try:
        # 用get_object_or_404替代get,避免未找到时抛出未捕获异常
        client = get_object_or_404(Client, user=request.user)
        customer = client.customer.first()
        if customer and customer.logo:
            logo = customer.logo.url  # 直接使用url属性,无需拼接MEDIA_URL
            print("GOT LOGO")
    except Exception as e:
        logo = ""
        print(f'ERROR FOR LOGO: {e}')
    finally:
        return JsonResponse({"logo": logo})

三、URL配置与其他检查

  1. 若项目使用Django 2.0及以上版本,建议使用path替代url(兼容性更好且更直观):
from django.urls import path
from . import views

urlpatterns = [
    path('get/company_logo/', views.view_company_logo, name='company-logo'),
]
  1. 检查是否有其他URL路由优先匹配了/get/company_logo/,导致请求未到达目标视图。
  2. 确认用户已登录:视图中依赖request.user,未登录用户会触发Client查询失败,@login_required装饰器可提前拦截未登录请求。

内容的提问来源于stack exchange,提问作者Doing Things Occasionally

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:04:52