Django не будет обновлять staticfiles
это раздражает. У меня есть файл javascript, на который ссылается шаблон django:
 <script src="{% static 'js/login.js' %} "></script>
я внес некоторые изменения в этот файл js. Потом я обновил страницу и я не вижу изменений.
Если я удаляю javascript из файла и помещаю его в HTML, он работает правильно, но если я попытаюсь сделать это с помощью внешнего JS-файла, то это не так. Я попытался закрыть сервер и запустить runserver несколько раз, я также попытался перейти с Firefox на Chrome. В этом нет никакого смысла. Пожалуйста, помогите мне понять, я могу уйти от включения всех js внутри HTML, но меня беспокоит, что я больше не могу делать это нормально.
подробнее об этой ошибке (самая странная вещь, которую я нашел#$&%#):
javascript-это что-то вроде этого:
old_sentence = "Dig that hole, forget the sun"  // this is what I want to change
$("#jqselector").text(old_sentence)
new_sentence = "Run, rabbit, run"  // this is the new sentence, it just won't show up.
Итак, я изменил js и перезапустил сервер, все еще html показывает старое предложение. Затем я удалил ссылку на вход.JS файл и поместить все js внутри тегов скрипта в HTML, конечно же, появляется новое предложение. Затем я включаю логин.JS-файл, прокомментируйте js внутри html, но я удаляю все содержимое внутри логина.файл js, делая его пустым файлом... но старая фраза все равно всплывает. Поэтому старый логин.файл js должен быть обналичен где-то, я не знаю. Затем я открываю Chrome и пробую все это снова, та же проблема.
что это может быть? есть ли возможность заставить django обновить staticfiles? Я думал перезапустить сервера было достаточно. .. должен ли я перезагрузить компьютер? : / lol.
9 ответов
- очистка статического файла - python manage.py collectstatic --noinput --clear. Это очистит статику заранее.
- очистить кэш браузера 
- добавить случайную строку после JS-файла include, e.g jquery.Яш?rand=23423423, с каждой нагрузкой. 
- это помогло?
похоже, что оба ваших браузера имеют кэшированный файл javascript. В Chrome вы можете очистить кэш, нажав Ctrl + Shift + Del и тикают просто "кэшированные изображения и файлы". Firefox, вероятно,имеет аналогичный ярлык. 
вы можете взглянуть на этот вопрос на советы, чтобы отключить кэширование статических файлов на сервере разработки в целом.
вам нужно сломать кэш браузера. Этот тег шаблона выведет UUID на основе времени, когда DEBUG=True. В противном случае он будет искать PROJECT_VERSION переменные среды. Если это не найдено, он выведет статический номер версии.
from django import template                                                                                                              
from django.conf import settings                                                                                                         
register = template.Library()                                                                                                            
@register.simple_tag(name='cache_bust')                                                                                                  
def cache_bust():                                                                                                                        
    if settings.DEBUG:                                                                                                                   
        version = uuid.uuid1()                                                                                                           
    else:                                                                                                                                
        version = os.environ.get('PROJECT_VERSION')                                                                                       
        if version is None:                                                                                                              
            version = '1'                                                                                                                
    return '__v__={version}'.format(version=version)
вы бы использовали в шаблоне, как это:
{% load cache_bust %}
<link rel="stylesheet" href="{% static "css/project.css" %}?{% cache_bust %}"/>
и вот результат:
<link rel="stylesheet" href="/static/css/project.css?__v__=7d88de4e-7258-11e7-95a7-0242ac130005"/>
Я тоже боролся с этой проблемой в течение нескольких часов. Я попытался ввести случайную строку с помощью Javascript, но этот метод кажется глупым и уродливым. Один из возможных способов справиться с этой проблемой-ввести пользовательский тег. Смотрите это документ дополнительные сведения:
в частности, вам нужно создать пакет под названием templatetags в любых созданных вами приложениях (или создайте новое, если хотите). И вы создаете любой файл в этом пакете, и пишете что-то вроде это:
from django import template
from django.utils.crypto import get_random_string
from django.templatetags import static
register = template.Library()
class StaticExtraNode(static.StaticNode):
    def render(self, context):
        return super().render(context) + '?v=' + get_random_string(32)
@register.tag('static_no_cache')
def do_static_extra(parser, token):
    return StaticExtraNode.handle_token(parser, token)
def static_extra(path):
    return StaticExtraNode.handle_simple(path)
тогда вы можете использовать tag {% static_no_cache '.../.../path...' %} создать путь со случайными аргументами!
надеюсь, это поможет!
Если ничего не работает, найдите имя файла в проекте и найдите неожиданную копию. Если вы сохранили в неправильном месте (другое приложение) в какой-то момент или откололи новое приложение от старого, приоритет загрузки может сыграть с вами злую шутку.
вместо использования сложных решений вы можете добавить дополнительный параметр к вашим услугам в шаблоны.
для статических включает в себя:
<script src="{% static 'js/polls/polls.js' %}?version=1"></script>
для direct включает в себя:
<link rel="stylesheet" type="text/css" href="/site_media/css/style.css?version=1" />  
Примечание ?version=1 в коде. Каждый раз, когда вы изменяете файл css/js, измените эту версию в шаблоне, поэтому браузер будет вынужден перезагрузить файл.
и если вы хотите избежать кэширования по какой-то неизвестной причине, вы можете использовать текущий метка времени вместо версии:
<link rel="stylesheet" type="text/css" href="/site_media/css/style.css?{% now "U" %}" />
если вы не хотите обновлять кэш браузера при каждом изменении файлов CSS и JavaScript или при стилизации изображений, вам нужно установить STATIC_URLдинамически с изменяющимся компонентом пути. С динамически изменяющимся URL, всякий раз, когда код обновляется, браузер посетителя будет принудительно загружать все новые некэшированные статические файлы. В этом рецепте мы установим динамический путь для STATIC_URL использование времени последнего редактирования в ОС.
import os
from datetime import datetime    
def get_file_changeset(absolute_path):
    timestamp = max(map(lambda x: os.path.getmtime(x[0]), os.walk(os.path.join(absolute_path, 'static'))))
    try:
        timestamp = datetime.utcfromtimestamp(int(timestamp))
    except ValueError:
        return ""
    changeset = timestamp.strftime('%Y%m%d%H%M%S')
    return changeset
и следующее изменение в вашей SETTINGS: 
from utils.misc import get_file_changeset
STATIC_URL = "/static/%s/" % get_file_changeset(BASE_DIR)
как работает:
The 
Ваш браузер будет кэшировать изображения и файлы (включая javascript). Во-первых, очистите только кэшированные изображения и файлы. Затем используйте режим инкогнито в chrome или частный просмотр в firefox во время внесения изменений в свой .JS файлы, так что вы видите их сразу после обновления страницы
