【问题标题】:CSS not applying to HTML page when receiving a new render in Django在 Django 中接收新渲染时,CSS 不适用于 HTML 页面
【发布时间】:2019-11-03 07:52:37
【问题描述】:

我目前正在努力解决 HTML 响应的问题。 我有一个带有 CSS 的 HTML 页面,JS 工作正常,用户将进行交互,该交互将转到 JS -> 发送 ajax 请求并在工作视图中进行一些处理。这个视图给了我一个渲染的视图,所有的信息都更新了。

问题是给出的 HTML 包含所有内容,但看起来像“原始”HTML,也就是没有应用 CSS,(脚本工作正常)

在我的 HTML 文件的头部:

  <head>
<meta charset="utf-8">
<title>Sorting video: {{video.title}}</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="https://www.w3schools.com/w3css/4/w3.css">
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'modelReco/cssFiles/swipeFrames.css' %}?v=00002'">
<script type="text/javascript" src='{% static "modelReco/jsScript/swipeFrames.js" %}?v=00003'></script>
  </head>

呈现 HTML 的视图:

def sendSortVideoResponse(request,untreatedFrame,myVideo,frames,tracks,url):
    response = render(request, url, {
            'video':myVideo,
            'frames':frames,
            'tracks':tracks,
            'untreatedFrame': untreatedFrame[0],
            'countTreated': untreatedFrame[1],
            'totalFrames': len(frames),
            'progressBar': untreatedFrame[1]/len(frames)*100,
    })
   response["Cache-Control"] = "no-cache, no-store, must-revalidate" 
   response["Pragma"] = "no-cache" # HTTP 1.0.
   response["Expires"] = "0" # Proxies.
   return response

在 settings.py 中:

PROJECT_ROOT = os.path.join(os.path.dirname(__file__), '..')
SITE_ROOT = PROJECT_ROOT

MEDIA_ROOT = os.path.join(SITE_ROOT, 'media')
MEDIA_URL = '/media/'

STATIC_ROOT = os.path.join(SITE_ROOT, 'static')
STATIC_URL = '/static/'

如果您对页面进行 F5,那么一切都会再次正常运行。 对于用户来说,他所在的页面不会重新加载,所以这可能是问题所在,但我有另一个样式表正在完美地运行进度条,所以我很困惑。 所以这可能是对静态文件的不好使用

编辑网络和页面:

互动前: 互动后:

编辑 2:呈现的 HTML

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Sorting video: fashionShow2</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
    <link rel="stylesheet" type="text/css" href="https://www.w3schools.com/w3css/4/w3.css">

    <link rel="stylesheet" type="text/css" href="/static/modelReco/cssFiles/swipeFrames.css?v=00002'">
    <script type="text/javascript" src='/static/modelReco/jsScript/swipeFrames.js?v=00003'></script>
  </head>
  <body>
    <h1>Video: fashionShow2</h1>

    <p>What can you do on this page?</p>
    <p>You've chosen to sort the video fashionShow2, this means you want to help the A.I to recognize the model by simply clicking on the models and validate your answer</p>

      <div id = 7951 class = "untreatedFrame" style="zoom:.6;-o-transform: scale(.6);-moz-transform: scale(.6)" >
        <img class = "frameImg" src="/media/fashionShow2/frames/7951.png"/>
          <a class = "frameImg" style="top: 0%; left: 65%; width: 35%; height: 100%;" onmouseover="displayValidation('rightCorner',true)" onmouseout="displayValidation('rightCorner',false)" onclick="validateFrameChoice(7951,1,true,'/modelReco/sortedTracks')">
            <div id="rightCorner" class = "validationCorner"></div>
          </a>
          <a class = "frameImg" style="top: 0%; left: 0%; width: 35%; height: 100%;" onmouseover="displayValidation('leftCorner',true),true" onmouseout="displayValidation('leftCorner',false)" onclick="validateFrameChoice(7951,-1,false,'/modelReco/sortedTracks')">
            <div id="leftCorner" class = "validationCorner"></div>
          </a>
      </div>

      <div class="w3-container">
        <div class="w3-light-grey w3-round-xlarge">
          <div class="w3-container w3-blue w3-round-xlarge" style="width:73.01587301587301%">46/63</div>
        </div>
      </div>
      <input type="button" value="Cancel previous choice" onclick="cancelPreviousChoice(7951)" />

    <form action="/modelReco/">
        <input type="submit" value="Return to home" />
    </form>
    <script>
    </script>


  </body>
</html>

【问题讨论】:

  • 手动打开生成的静态文件 URL 并显示 HTTP 响应状态。
  • 操作后还要检查 HTML 的有效性。
  • 我在在线验证器上检查了它,除了一些警告之外,没什么特别的,我在交互后编辑了我的 HTML

标签: django django-templates django-staticfiles


【解决方案1】:

我在这个问题上找到了问题。如果您尝试使用 ajax 并通过像我一样用 Jquery 替换所有内容来呈现新的 HTML ($("*").html(data);)。 在你的 body 元素上应用 CSS 时要小心,因为浏览器 (as it is said on this post) 通常不关心这些标签并将其删除。

这就是为什么在我检索到的 ajax 数据中,我拥有正文和所有内容,但是当被浏览器呈现时,正文标签就消失了。

如果您需要将 CSS 标签应用于 body,只需添加一个像这样的 div 标签并在其上应用您的 css :

<body>
  <div id="body">
    .... 
  </div>
</body>

唯一奇怪的是,当你用 Django 对页面进行 F5 时,body 标签又回来了,所以第一眼看起来没问题,但是在没有刷新的情况下渲染时没有显示 body 标签。

【讨论】:

    【解决方案2】:

    settings.py

    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    STATIC_URL = '/static/'
    
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    MEDIA_URL = '/media/'
    

    urls.py(项目不是应用)

    from django.conf import settings
    from django.conf.urls.static import static
    ...
    
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    

    【讨论】:

    • 不会改变任何东西 ;( 是的,我把它放在了项目中
    • 尝试将{% static 'modelReco/cssFiles/swipeFrames.css' %} 更改为/static/ modelReco/cssFiles/swipeFrames.css。将相同的内容应用于您包含的所有静态文件(css、js..)
    • 我试过了,还是不行。我理解您为什么要这样做,但我的静态文件由网络提供良好的服务,我之前没有看到任何错误,例如“404”。 HTML 有 CSS 文件,但不应用它
    • 您是否尝试清除缓存?有时浏览器即使在更改后也会使用旧的 css
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2012-02-14
    • 2020-09-07
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    相关资源
    最近更新 更多