loading

Logout succeed

Logout succeed. See you again!

ebook img

The Definitive Guide to Hotwire and Django PDF

pages199 Pages
release year2022
file size3.59 MB
languageEnglish

Preview The Definitive Guide to Hotwire and Django

Contents 1 Introduction 1 1.1 WhatisHotwire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 Objectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.3 Whatisincluded. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.4 Demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.5 Whatifyouhaveproblemorsuggestions . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.6 Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 CreateAproject 3 2.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.2 CreateDjangoProject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.3 Installpython-webpack-boilerplate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.4 Runfrontendproject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.5 InstallTailwind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.6 WriteTailwindCSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.7 TestinDjangoTemplate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.8 JIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.9 SetupLiveReload . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3 SetupTurbo 12 3.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.2 Turbo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.3 Preparation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.4 SetupTurbo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.5 Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.6 Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 4 CreateTaskApp 16 4.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 4.2 TasksApp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 4.3 Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 4.4 Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 5 RenderDjangoFormwithTailwindCSSStyle 18 5.1 Objectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 5.2 DjangoApp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 5.3 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 5.4 Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 5.5 URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 5.6 Manualtest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 5.7 tailwindcss-forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 5.8 crispy-tailwind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 5.9 JIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 5.10 TestAgain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 6 ExploreTurboDrive(PageNavigation) 27 6.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 i 6.2 ListPage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 6.3 AddNavBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 6.4 HowTurboDriveWorks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 6.5 PageNavigationBasics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 6.6 SimpleTests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 7 ExploreTurboDrive(Cache) 31 7.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 7.2 turbo:before-cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 7.3 data-turbo-cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 7.4 turbo-cache-control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 7.5 ImprovePageNavigationStyle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 8 ExploreTurboDrive(Javascript,CSS) 35 8.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 8.2 WheretoputJavascriptbundle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 8.3 defer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 8.4 Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 8.5 ManualTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 8.6 DOMContentLoaded . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 8.7 HandleScriptin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 8.8 HandleScriptin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 8.9 AutoReloadonAssetsChange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 8.10 InlineScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 9 ExploreTurboDrive(3-partyJavascript) 41 9.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 9.2 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 9.3 Whydidithappen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 9.4 Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 10 TurboDriveandDjangoformvalidation 43 10.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 10.2 DjangoFormValidation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 10.3 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 10.4 RedirectAfterFormSubmission . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 10.5 Workflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 10.6 UnprocessableEntity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 11 PreparetolearnTurboFrame 47 11.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 11.2 DjangoApp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 11.3 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 11.4 Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 11.5 Frontend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 11.6 URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 11.7 Manualtest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 12 TurboFrameBasics 55 12.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 12.2 WhatisTurboFrame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 12.3 SimpleExample . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 12.4 AddTurboFrame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 12.5 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 13 TurboFrameandDjangoForm 60 13.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 13.2 LoadDjangoForminTurboFrame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 13.3 Formaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 ii 13.4 Formresponse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 13.5 Installdjango-turbo-response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 13.6 ReturnTurboResponseusingdjango-turbo-response . . . . . . . . . . . . . . . . . . . . . 64 13.7 FixFormonthestandardpage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 14 InlineEditingwithTurboFrames 67 14.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 14.2 Detail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 14.3 Edit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 14.4 Delete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 14.5 ManualTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 15 PrepareDjangoapptolearnStimulusBasics 71 15.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 15.2 DjangoApp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 15.3 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 15.4 Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 15.5 Frontend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 15.6 URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 15.7 Manualtest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 16 StimulusControllerBasics 75 16.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 16.2 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 16.3 InstallStimulus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 16.4 FirstStimulusController . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 16.5 RegisterController . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 16.6 Howtousethecontroller. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 16.7 Workflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 16.8 AutoLoadingControllers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 17 StimulusController(Actions,Values) 79 17.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 17.2 ControllerInstanceState . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 17.3 Getter,Setter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 17.4 StimulusValues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 17.5 Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 18 StimulusController(Targets,CSSclasses) 84 18.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 18.2 Improvestyle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 18.3 Target . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 18.4 MultipleTarget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 18.5 CSSclasses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 18.6 Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 19 StimulusController(Lifecycle) 90 19.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 19.2 LoadpagecontentwithTurboFrame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 19.3 ManualTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 19.4 LifecycleCallback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 19.5 initializevsconnect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 19.6 PageCache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 20 StimulusController(3-partyResources) 96 20.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 20.2 Background . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 20.3 StimulusController . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 20.4 ManualTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 iii 20.5 ContentLoader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 21 StimulusController(DatePicker) 99 21.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 21.2 Preparation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 21.3 Frontend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 21.4 ManualTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 21.5 CustomFormWidget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 21.6 Flatpickr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 21.7 Notes: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 22 StimulusController(FormSubmission) 105 22.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 22.2 Workflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 22.3 Spinner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 22.4 FormController . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 22.5 CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 22.6 Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 23 PrepareDjangoapptolearnStimulusandTurboFrame 110 23.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 23.2 DjangoApp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 23.3 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 23.4 Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 23.5 Frontend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 23.6 URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 23.7 Manualtest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 24 StimulusController(FlashMessage) 118 24.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 24.2 tailwindcss-stimulus-components. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 24.3 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 24.4 MESSAGE_TAGS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 24.5 Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 24.6 URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 24.7 Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 24.8 Notes: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 25 BuildStimulusControllerforModal 123 25.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 25.2 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 25.3 Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 25.4 Frontend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 25.5 ManualTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 25.6 MakeTailwindJITworkwith3-partynpmpackage . . . . . . . . . . . . . . . . . . . . . . 126 26 LoadFormintheModal 128 26.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 26.2 ExtendModalController . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 26.3 Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 26.4 ManualTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 26.5 Lazy-loadedframe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 26.6 TurboFrame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 27 HandleFormSubmissioninModal 133 27.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 27.2 ManualTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 27.3 CloseModalAftersuccessfulformsubmission . . . . . . . . . . . . . . . . . . . . . . . . 135 27.4 Asyncmethod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 iv 28 FullPageRedirectinModal 137 28.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 28.2 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 28.3 Solution1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 28.4 Solution2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 29 CommunicationAmongStimulusControllersViaEvents 140 29.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 29.2 Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 29.3 Preparation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 29.4 Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 29.5 SendMessagefromChildtoParent. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 29.6 SendMessagefromParenttoChild. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 30 PrepareDjangoapptolearnStimulusStream 148 30.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 30.2 DjangoApp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 30.3 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 30.4 Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 30.5 Frontend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 30.6 URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 30.7 Manualtest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 31 ImportTurboFrame 156 31.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 31.2 IndexPage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 31.3 LoadDjangoForminTurboFrame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 31.4 ReturnTurboFrame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 31.5 Question . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 32 TurboStreamBasics 161 32.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 32.2 WhatisTurboStream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 32.3 SimpleTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 32.4 Message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 32.5 text/vnd.turbo-stream.html . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 32.6 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 33 UseTurboStreamtoimproveinlineediting 166 33.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 33.2 ListPage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 33.3 DetailPage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 33.4 EditPage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 33.5 DeletePage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 33.6 ManualTest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 34 FilteringontheListPage 171 34.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 34.2 Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 34.3 Pagination . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 34.4 TurboFrame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 34.5 LoadingOpacity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 35 AutoSearch 177 35.1 Objective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 35.2 Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 35.3 Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 35.4 Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 35.5 TurboStreamHeader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 v 35.6 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 36 RealTimeUpdatebasedonWebsocket(Part1) 181 36.1 Websocket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 36.2 Redis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 36.3 django-channels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 36.4 Routing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 36.5 StimulusController . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 36.6 Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 37 RealTimeUpdatebasedonWebsocket(Part2) 188 37.1 SignalReceiver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 37.2 Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 37.3 ReconnectingWebSocket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 37.4 Notes: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 37.5 Ifyouwanttodivedeeper: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 38 NextSteps 191 38.1 LearningResources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 38.2 MyNextStep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 38.3 ThankYou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 vi Chapter 1 Introduction 1.1 What is Hotwire Hotwire(HTMLOVERTHEWIRE)isanalternativeapproachtobuildingmodernwebapplicationswithout usingmuchJavaScriptbysendingHTMLinsteadofJSONoverthewire. 1. ItisbuiltbyBasecamp(itpowerstheHEYemailservice). 2. Ithasahealthyecosystem,andtherearemanyrelevantprojects,tutorialsaboutit. 3. IthasbecomethedefaultfrontendsolutionsinRails. 4. ItisalsoverypopularinthePHPcommunity(Laravel,Symfony). 1.2 Objectives ThisbookwillhelpyoutolearnHotwirewithDjangoinsystematicway. Bytheendofthisbook,youwillbeableto: 1. LearnHowtwireincludesTurboandStimulus,andwhatproblemtheycanhelpsolve. 2. JumpstartfrontendprojectbundledbyWebpack. 3. SetupTurboandStimulus. 4. LearnhowpagenavigationworksinTurbo Drive 5. UnderstandwhatiscacheinTurboDriveandhowpreviewworks. 6. LearnwhatisTurbo Frameandhowitworks. 7. BuildInline EditingfeaturewithTurbo Frame. 8. LearnwhatisStimulusandhowStimulus Controllerwork. 9. WhatisStimulusValues,Targes,andActions 10. UseStimulustobuildaDatetimepickerandimproveformsubmissionprocess. 11. UnderstandhowtouseeventstodocommunicationamongStimuluscontrollers 12. BuildType as searchfeaturewithStimulus,TurboandDjango. 13. LearnwhatisTurbo Streamandhowitworks. 14. HowtobuildCollaborative EditingbasedonWebsocketandTurbo Stream WithHotwire,wecanbringSPA-like experiencetoourDjangowebapp: 1 DefinitiveGuidetoHotwireandDjango,Release1.0.0 1. WedoNOTneedheavyfrontendsolutionsuchasReact,Vue 2. WedoNOTneedJSONandDjangoRESTframework 3. WewilluseDjangoform,Djangotemplatesandtheystillrock. 1.3 What is included 1. APDFebookwhichcontainsabout40chapters. 2. Thesourcecodeoftheproject. 1.4 Demo Thedemoisavailableonhttp://hotwire-django.herokuapp.com/ 1.5 What if you have problem or suggestions Ifyoumeetproblem,pleasecheckFAQfirst(youcanfinditattheendofthebook) Ifyouwanttotalkwithme,pleasesendemailto [email protected] 1.6 Changelog 1.6.1 1.0.0 • 2022-05-27: Published • 2022-05-25: Reviewfinished • 2022-02-15: Draftversionfinished • 2021-12-23: Startedwriting 2 Chapter1. Introduction Chapter 2 Create A project 2.1 Objective 1. CreateADjangoproject 2. Usepython-webpack-boilerplatetojumpstartfrontendprojectbundledbyWebpack. 3. ImportTailwindCSSasstylesolution. 4. SetupLiveReloadwithwebpack-dev-server 2.2 Create Django Project IrecommendtousePython3.9+ $ mkdir hotwire_django_project && cd hotwire_django_project $ python3 -V Python 3.9.9 # create virtualenv $ python3 -m venv venv $ source venv/bin/activate YoucanalsouseothertoolssuchasPoetry1orPipenv2 Createrequirements.txt django==3.2 (venv)$ pip install -r requirements.txt (venv)$ django-admin.py startproject hotwire_django_app . Youwillseestructurelikethis . ├── hotwire_django_app ├── env ├── manage.py └── requirements.txt Now,let’sgettheprojectrunningonlocalenv. 1https://python-poetry.org/ 2https://pipenv.pypa.io/ 3

See more

The list of books you might like