├── .gitignore ├── LICENSE ├── README.md ├── djviews.sublime-project ├── djviews.sublime-workspace ├── pip-selfcheck.json └── src ├── blog ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ └── __init__.py ├── models.py ├── templates │ └── blog │ │ ├── create-view.html │ │ ├── delete-view.html │ │ ├── detail-view.html │ │ ├── list-view-public.html │ │ ├── list-view.html │ │ ├── search-blog.html │ │ └── update-view.html ├── tests.py ├── urls.py └── views.py ├── db.sqlite3 ├── djviews ├── __init__.py ├── settings.py ├── urls.py ├── views.py └── wsgi.py └── manage.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.py[cod] 2 | .DS_Store 3 | 4 | bin/ 5 | include/ 6 | lib/ 7 | 8 | 9 | # Byte-compiled / optimized / DLL files 10 | __pycache__/ 11 | *.py[cod] 12 | *$py.class 13 | 14 | # C extensions 15 | *.so 16 | 17 | # Distribution / packaging 18 | .Python 19 | env/ 20 | build/ 21 | develop-eggs/ 22 | dist/ 23 | downloads/ 24 | eggs/ 25 | .eggs/ 26 | lib/ 27 | lib64/ 28 | parts/ 29 | sdist/ 30 | var/ 31 | *.egg-info/ 32 | .installed.cfg 33 | *.egg 34 | 35 | # PyInstaller 36 | # Usually these files are written by a python script from a template 37 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 38 | *.manifest 39 | *.spec 40 | 41 | # Installer logs 42 | pip-log.txt 43 | pip-delete-this-directory.txt 44 | 45 | # Unit test / coverage reports 46 | htmlcov/ 47 | .tox/ 48 | .coverage 49 | .coverage.* 50 | .cache 51 | nosetests.xml 52 | coverage.xml 53 | *,cover 54 | .hypothesis/ 55 | 56 | # Translations 57 | *.mo 58 | *.pot 59 | 60 | # Django stuff: 61 | *.log 62 | local_settings.py 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # IPython Notebook 78 | .ipynb_checkpoints 79 | 80 | # pyenv 81 | .python-version 82 | 83 | # celery beat schedule file 84 | celerybeat-schedule 85 | 86 | # dotenv 87 | .env 88 | 89 | # virtualenv 90 | .venv/ 91 | venv/ 92 | ENV/ 93 | 94 | # Spyder project settings 95 | .spyderproject 96 | 97 | # Rope project settings 98 | .ropeproject -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Coding For Entrepreneurs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Django Views Unleashed Logo](https://cfe-static.s3.amazonaws.com/media/django-views-unleashed/images/unleasing_django_views.png) 2 | 3 | # Django Views Unleashed 4 | 5 | Django Views Unleashed is reference series to teach you about Django views. Created using Django 1.10. Created by Team CFE @ http://joincfe.com. 6 | 7 | Subscribe to our [YouTube Channel](http://joincfe.com/youtube) 8 | 9 | Thanks for watching! 10 | 11 | Team CFE 12 | 13 | 14 | ## Lecture Code 15 | 16 | 17 | [2 - Install & First View](../../tree/ffb455b6be76930df5ec52bde53f4fd4e5d82f1d) 18 | 19 | [3 - HttpResponse & HttpResponseRedirect](../../tree/7b25a4c3babc45942c65ead8e365fa0baa7de85d) 20 | 21 | [4 - CRUD and Views](../../tree/cc800cb01a049c01e4bb346a4de2fdf38ff93e3e) 22 | 23 | [5 - Render a Template](../../tree/670e893a7e0138b1b15caaf3c564ccd592cf6cde) 24 | 25 | [6 - Context in Views](../../tree/70ab5de861f9f65ee6804c43b1cafe06e63a74f5) 26 | 27 | [7 - User Context & Login Required](../../tree/cb365b1b4556de59d2a568a59401279911e43ca4) 28 | 29 | [8 - Detail View](../../tree/241d61b40695c63d252b4f37a9f07514a36a84af) 30 | 31 | [9 - Create View](../../tree/2a69b01ecd618e105e4e3b144f4f35ee4a644124) 32 | 33 | [10 - Update View](../../tree/c92d392500b33c2da7f7dc04f4832050cd8e3ecc) 34 | 35 | [11 - Delete View](../../tree/ba1bb3e475ee4de5cf60df9303a1bb040be6a26c) 36 | 37 | [12 - Combining Crud in 1 View](../../tree/b8a1b7191d4a61d90e85182e702f769f9cbb36c0) 38 | 39 | [13 - Search in List View & Q Lookups](../../tree/04f824057113f4954d1aedd163032eb41ed937a0) 40 | 41 | 14 - Thank you! (No code here) 42 | -------------------------------------------------------------------------------- /djviews.sublime-project: -------------------------------------------------------------------------------- 1 | { 2 | "folders": 3 | [ 4 | { 5 | "path": "/Users/cfe/Desktop/djviews" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /djviews.sublime-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "auto_complete": 3 | { 4 | "selected_items": 5 | [ 6 | [ 7 | "pub", 8 | "publish_date" 9 | ], 10 | [ 11 | "time", 12 | "timezone" 13 | ], 14 | [ 15 | "auto", 16 | "auto_now" 17 | ], 18 | [ 19 | "Post", 20 | "PostModel" 21 | ], 22 | [ 23 | "blog", 24 | "blog_post_model_pre_save_receiver" 25 | ], 26 | [ 27 | "pos", 28 | "post_model_post_save_receiver" 29 | ], 30 | [ 31 | "Po", 32 | "PostModel" 33 | ], 34 | [ 35 | "val", 36 | "validate_justin" 37 | ], 38 | [ 39 | "va", 40 | "validate_author_email" 41 | ], 42 | [ 43 | "pat", 44 | "patterns" 45 | ], 46 | [ 47 | "Ht", 48 | "HttpResponse" 49 | ], 50 | [ 51 | "r", 52 | "return" 53 | ], 54 | [ 55 | "obj", 56 | "obj_url" 57 | ], 58 | [ 59 | "k", 60 | "kwargs" 61 | ], 62 | [ 63 | "se", 64 | "settings" 65 | ], 66 | [ 67 | "kirr", 68 | "kirr_redirect_view" 69 | ], 70 | [ 71 | "Kir", 72 | "KirrURL" 73 | ], 74 | [ 75 | "in", 76 | "instance" 77 | ], 78 | [ 79 | "s", 80 | "shortcode" 81 | ], 82 | [ 83 | "ran", 84 | "random" 85 | ], 86 | [ 87 | "aut", 88 | "auto_now_add" 89 | ], 90 | [ 91 | "ch", 92 | "chars" 93 | ], 94 | [ 95 | "file", 96 | "filename" 97 | ], 98 | [ 99 | "save", 100 | "save_path" 101 | ], 102 | [ 103 | "get", 104 | "get_payload" 105 | ], 106 | [ 107 | "email", 108 | "email_message" 109 | ], 110 | [ 111 | "inb", 112 | "inbox_item_list" 113 | ], 114 | [ 115 | "ea", 116 | "email_message" 117 | ], 118 | [ 119 | "html", 120 | "html_text" 121 | ], 122 | [ 123 | "ema", 124 | "email_message" 125 | ], 126 | [ 127 | "acc", 128 | "access_secret" 129 | ], 130 | [ 131 | "con", 132 | "consumer_secret" 133 | ], 134 | [ 135 | "cons", 136 | "consumer_key" 137 | ], 138 | [ 139 | "BlogList", 140 | "blogListController" 141 | ], 142 | [ 143 | "font", 144 | "font-size" 145 | ], 146 | [ 147 | "img", 148 | "img_r" 149 | ], 150 | [ 151 | "sel", 152 | "sel_soup" 153 | ], 154 | [ 155 | "web", 156 | "webdriver" 157 | ], 158 | [ 159 | "my", 160 | "my_num_list" 161 | ], 162 | [ 163 | "nu", 164 | "num_of_items" 165 | ], 166 | [ 167 | "my_", 168 | "my_num_list" 169 | ], 170 | [ 171 | "str", 172 | "str" 173 | ], 174 | [ 175 | "query", 176 | "queryset" 177 | ], 178 | [ 179 | "read", 180 | "read_time_min" 181 | ], 182 | [ 183 | "rea", 184 | "read_time_minutes" 185 | ], 186 | [ 187 | "count", 188 | "count_words" 189 | ], 190 | [ 191 | "cont", 192 | "content_type" 193 | ], 194 | [ 195 | "Co", 196 | "CommentForm" 197 | ], 198 | [ 199 | "Commen", 200 | "CommentForm" 201 | ], 202 | [ 203 | "H", 204 | "HttpResponseRedirect" 205 | ], 206 | [ 207 | "Comm", 208 | "CommentManager" 209 | ], 210 | [ 211 | "parent", 212 | "parent_qs" 213 | ], 214 | [ 215 | "parent_", 216 | "parent_id" 217 | ], 218 | [ 219 | "obje", 220 | "objects" 221 | ], 222 | [ 223 | "pare", 224 | "parent_id" 225 | ], 226 | [ 227 | "comm", 228 | "CommentManager" 229 | ], 230 | [ 231 | "Com", 232 | "Comment" 233 | ], 234 | [ 235 | "cle", 236 | "clean_parent_id" 237 | ], 238 | [ 239 | "COmm", 240 | "CommentManager" 241 | ], 242 | [ 243 | "content", 244 | "content_type" 245 | ], 246 | [ 247 | "co", 248 | "comments" 249 | ], 250 | [ 251 | "conten", 252 | "content_type" 253 | ], 254 | [ 255 | "mar", 256 | "margin-left" 257 | ], 258 | [ 259 | "conte", 260 | "contentItem" 261 | ], 262 | [ 263 | "mark", 264 | "markedContent" 265 | ], 266 | [ 267 | "titl", 268 | "titleItem" 269 | ], 270 | [ 271 | "tit", 272 | "titleValue" 273 | ], 274 | [ 275 | "use", 276 | "username" 277 | ], 278 | [ 279 | "get_o", 280 | "get_object" 281 | ], 282 | [ 283 | "usr", 284 | "username" 285 | ], 286 | [ 287 | "get_obj", 288 | "get_object_or_404" 289 | ], 290 | [ 291 | "sale", 292 | "sale_price" 293 | ], 294 | [ 295 | "ratin", 296 | "rating_obj" 297 | ], 298 | [ 299 | "prod", 300 | "product" 301 | ], 302 | [ 303 | "product", 304 | "productrating_set" 305 | ], 306 | [ 307 | "rai", 308 | "ratings" 309 | ], 310 | [ 311 | "rat", 312 | "ratings" 313 | ], 314 | [ 315 | "pro", 316 | "product_obj" 317 | ], 318 | [ 319 | "ra", 320 | "rating_obj" 321 | ], 322 | [ 323 | "ob", 324 | "objects" 325 | ], 326 | [ 327 | "Pr", 328 | "ProductRating" 329 | ], 330 | [ 331 | "Mu", 332 | "MultipleObjectsReturned" 333 | ], 334 | [ 335 | "Pro", 336 | "ProductRating" 337 | ], 338 | [ 339 | "inpu", 340 | "inputValue" 341 | ], 342 | [ 343 | "tra", 344 | "transactions_today" 345 | ], 346 | [ 347 | "today", 348 | "today_max" 349 | ], 350 | [ 351 | "date", 352 | "datetime" 353 | ], 354 | [ 355 | "get_", 356 | "get_transactions" 357 | ], 358 | [ 359 | "mode", 360 | "models" 361 | ], 362 | [ 363 | "is", 364 | "is_active" 365 | ], 366 | [ 367 | "Sell", 368 | "SellerAccount" 369 | ], 370 | [ 371 | "dow", 372 | "download_link" 373 | ], 374 | [ 375 | "w", 376 | "wrap" 377 | ], 378 | [ 379 | "http", 380 | "Http404" 381 | ], 382 | [ 383 | "produ", 384 | "product_obj" 385 | ], 386 | [ 387 | "fun", 388 | "function" 389 | ], 390 | [ 391 | "wid", 392 | "width" 393 | ], 394 | [ 395 | "po", 396 | "products" 397 | ], 398 | [ 399 | "to", 400 | "top_tags_idless" 401 | ], 402 | [ 403 | "Tag", 404 | "TagView" 405 | ], 406 | [ 407 | "new", 408 | "new_view" 409 | ], 410 | [ 411 | "Prod", 412 | "ProductDetailView" 413 | ], 414 | [ 415 | "ana", 416 | "analytic_obj" 417 | ], 418 | [ 419 | "an", 420 | "analytic_obj" 421 | ], 422 | [ 423 | "model", 424 | "models" 425 | ], 426 | [ 427 | "tag", 428 | "tag_set" 429 | ], 430 | [ 431 | "tags", 432 | "tags_list" 433 | ], 434 | [ 435 | "hd_", 436 | "hd_max" 437 | ], 438 | [ 439 | "hd", 440 | "hd_created" 441 | ], 442 | [ 443 | "temp", 444 | "temp_loc" 445 | ], 446 | [ 447 | "thu", 448 | "thumb_file" 449 | ], 450 | [ 451 | "Tu", 452 | "Thumbnail" 453 | ], 454 | [ 455 | "qu", 456 | "query" 457 | ], 458 | [ 459 | "mim", 460 | "mimetype" 461 | ], 462 | [ 463 | "Htt", 464 | "HttpResponse" 465 | ], 466 | [ 467 | "url", 468 | "urlpatterns" 469 | ], 470 | [ 471 | "des", 472 | "decorators" 473 | ], 474 | [ 475 | "form", 476 | "form_valid" 477 | ], 478 | [ 479 | "slug", 480 | "slugify" 481 | ], 482 | [ 483 | "sug", 484 | "slugify" 485 | ], 486 | [ 487 | "Upda", 488 | "UpdateView" 489 | ], 490 | [ 491 | "Crea", 492 | "CreateView" 493 | ], 494 | [ 495 | "mu", 496 | "MultiSlugMixin" 497 | ], 498 | [ 499 | "Product", 500 | "ProductDetailView" 501 | ], 502 | [ 503 | "ht", 504 | "Http404" 505 | ], 506 | [ 507 | "de", 508 | "description" 509 | ], 510 | [ 511 | "object", 512 | "object_id" 513 | ], 514 | [ 515 | "option", 516 | "option1" 517 | ] 518 | ] 519 | }, 520 | "buffers": 521 | [ 522 | { 523 | "settings": 524 | { 525 | "buffer_size": 0, 526 | "line_ending": "Unix" 527 | } 528 | } 529 | ], 530 | "build_system": "", 531 | "command_palette": 532 | { 533 | "height": 287.0, 534 | "selected_items": 535 | [ 536 | [ 537 | "mark", 538 | "Markdown Preview: Preview in Browser" 539 | ], 540 | [ 541 | "mar", 542 | "Markdown Preview: Preview in Browser" 543 | ], 544 | [ 545 | "markd", 546 | "Markdown Preview: Preview in Browser" 547 | ], 548 | [ 549 | "markdown", 550 | "Markdown Preview: Preview in Browser" 551 | ], 552 | [ 553 | "", 554 | "Convert Case: Lower Case" 555 | ], 556 | [ 557 | "package", 558 | "Package Control: List Packages" 559 | ], 560 | [ 561 | "install", 562 | "Package Control: Install Package" 563 | ] 564 | ], 565 | "width": 575.0 566 | }, 567 | "console": 568 | { 569 | "height": 125.0 570 | }, 571 | "distraction_free": 572 | { 573 | "menu_visible": true, 574 | "show_minimap": false, 575 | "show_open_files": false, 576 | "show_tabs": false, 577 | "side_bar_visible": false, 578 | "status_bar_visible": false 579 | }, 580 | "file_history": 581 | [ 582 | "/Users/cfe/Desktop/djmod/src/blog/migrations/validators.py", 583 | "/Users/cfe/Desktop/djmod/src/djmod/settings.py", 584 | "/Users/cfe/Desktop/djmod/.gitignore", 585 | "/Users/cfe/Desktop/kirr/src/shortener/models.py", 586 | "/Users/cfe/Desktop/kirr/src/requirements.txt", 587 | "/Users/cfe/Desktop/kirr/src/kirr/settings/__init__.py", 588 | "/Users/cfe/Desktop/kirr/src/kirr/settings/justin_settings.py", 589 | "/Users/cfe/Desktop/kirr/src/.gitignore", 590 | "/Users/cfe/Desktop/kirr/src/kirr/settings/production.py", 591 | "/Users/cfe/Desktop/kirr/src/kirr/settings/local.py", 592 | "/Users/cfe/Desktop/kirr/src/kirr/old_settings.py", 593 | "/Users/cfe/Desktop/kirr/src/Procfile", 594 | "/Users/cfe/Desktop/kirr/Procfile", 595 | "/Users/cfe/Library/Application Support/Sublime Text 2/Packages/User/Preferences.sublime-settings", 596 | "/Users/cfe/Desktop/trydjango110/src/kirr/hostscf/views.py", 597 | "/Users/cfe/Desktop/trydjango110/src/kirr/hostscf/urls.py", 598 | "/Users/cfe/Desktop/trydjango110/src/kirr/hostsconf/urls.py", 599 | "/Users/cfe/Desktop/trydjango110/src/kirr/hostsconf/views.py", 600 | "/Users/cfe/Desktop/trydjango110/src/kirr/hostsconf/__init__.py", 601 | "/Users/cfe/Desktop/trydjango110/src/shortener/management/commands/__init__.py", 602 | "/Users/cfe/Desktop/trydjango110/src/shortener/management/__init__.py", 603 | "/Users/cfe/Desktop/trydjango110/src/shortener/utils.py", 604 | "/Users/cfe/Desktop/trydjango110/.gitignore", 605 | "/Users/cfe/Desktop/trydjango110/readme.md", 606 | "/Users/cfe/Desktop/trydjango110/src/db.sqlite3", 607 | "/Users/cfe/Desktop/tweetup/src/tweet_it_up.py", 608 | "/Users/cfe/Desktop/tryangular/src/js/app/app.module.js", 609 | "/Users/cfe/Desktop/tryangular/src/js/app/app.config.js", 610 | "/Users/cfe/Desktop/tryangular/config.ru", 611 | "/Users/cfe/Desktop/tryangular/src/config.ru", 612 | "/Users/cfe/Desktop/tryangular/quicktips.md", 613 | "/Users/cfe/Desktop/tryangular/src/js/angular.min.js", 614 | "/Users/cfe/Desktop/tryangular/README.md", 615 | "/Users/cfe/Desktop/tryangular/new_log.md", 616 | "/Users/cfe/Desktop/tryangular/src/js/app/blogList/blog-list.component.js", 617 | "/Users/cfe/Desktop/tryangular/src/js/app/blogList/blog-list.module.js", 618 | "/Users/cfe/Desktop/tryangular/src/quicktips.md", 619 | "/Users/cfe/Desktop/tryangular/js/angular.min.js", 620 | "/Users/cfe/Desktop/tryangular/index.html", 621 | "/Users/cfe/Downloads/angular.min.js", 622 | "/Users/cfe/Desktop/scrape/notes/yelpapi.py", 623 | "/Users/cfe/Desktop/scrape/25/js_scrape.py", 624 | "/Users/cfe/Desktop/30DaysofPython/day5_functions_start.py", 625 | "/Users/cfe/Dropbox/CFE Projects/30 Days of Python/Notes/conditionals.py", 626 | "/Users/cfe/Desktop/blog-api/src/posts/forms.py", 627 | "/Users/cfe/Desktop/blog-api/src/blog/settings.py", 628 | "/Users/cfe/Desktop/blog-api/src/posts/serializers.py", 629 | "/Users/cfe/Desktop/blog-api/requirements.txt", 630 | "/Users/cfe/Desktop/blog-api/src/comments/migrations/0002_auto_20160325_2151.py", 631 | "/Users/cfe/Desktop/blog/src/posts/models.py", 632 | "/Users/cfe/Desktop/blog/src/posts/utils.py", 633 | "/Users/cfe/Desktop/blog/src/posts/views.py", 634 | "/Users/cfe/Desktop/blog/src/comments/forms.py", 635 | "/Users/cfe/Desktop/blog/src/blog/urls.py", 636 | "/Users/cfe/Desktop/blog/src/templates/comment_thread.html", 637 | "/Users/cfe/Desktop/blog/src/templates/post_detail.html", 638 | "/Users/cfe/Desktop/blog/src/comments/views.py", 639 | "/Users/cfe/Desktop/blog/src/comments/urls.py", 640 | "/Users/cfe/Desktop/blog/src/comments/models.py", 641 | "/Users/cfe/Desktop/blog/README.md", 642 | "/Users/cfe/Desktop/blog/src/posts/migrations/0004_post_read_time.py", 643 | "/Users/cfe/Desktop/blog/src/templates/base.html", 644 | "/Users/cfe/Desktop/blog/src/templates/comments/comment_thread.html", 645 | "/Users/cfe/Desktop/blog/src/static/css/base.css", 646 | "/Users/cfe/Desktop/blog/src/posts/urls.py", 647 | "/Users/cfe/Desktop/blog/src/comments/migrations/0002_comment_parent.py", 648 | "/Users/cfe/Desktop/blog/src/posts/forms.py", 649 | "/Users/cfe/Desktop/blog/src/templates/post_list.html", 650 | "/Users/cfe/Desktop/blog/src/blog/settings.py", 651 | "/Users/cfe/Desktop/blog/src/comments/admin.py", 652 | "/Users/cfe/Desktop/blog/static_cdn/css/base.css", 653 | "/Users/cfe/Desktop/blog/src/templates/post_form.html", 654 | "/Users/jmitch/Desktop/blog/src/blog/urls.py", 655 | "/Users/jmitch/Desktop/blog/src/blog/settings.py", 656 | "/Users/jmitch/Desktop/blog/src/db.sqlite3", 657 | "/Users/jmitch/Desktop/blog/src/blog/wsgi.py", 658 | "/Users/jmitch/Desktop/blog/README.md", 659 | "/Users/jmitch/Desktop/dm/src/products/views.py", 660 | "/Users/jmitch/Desktop/dm/src/templates/form.html", 661 | "/Users/jmitch/Desktop/dm/src/templates/form_include.html", 662 | "/Users/jmitch/Desktop/dm/src/sellers/forms.py", 663 | "/Users/jmitch/Desktop/dm/src/templates/base.html", 664 | "/Users/jmitch/Desktop/dm/src/digitalmarket/mixins.py", 665 | "/Users/jmitch/Desktop/dm/src/templates/products/product_list_snippet.html", 666 | "/Users/jmitch/Desktop/dm/src/templates/products/library_list.html", 667 | "/Users/jmitch/Desktop/dm/src/products/urls.py", 668 | "/Users/jmitch/Desktop/dm/src/templates/products/product_detail.html", 669 | "/Users/jmitch/Desktop/dm/src/templates/products/product_list.html", 670 | "/Users/jmitch/Desktop/dm/src/products/tests.py", 671 | "/Users/jmitch/Desktop/dm/src/products/admin.py", 672 | "/Users/jmitch/Desktop/dm/src/sellers/models.py", 673 | "/Users/jmitch/Desktop/dm/src/products/models.py", 674 | "/Users/jmitch/Desktop/dm/src/templates/dashboard/view.html", 675 | "/Users/jmitch/Desktop/dm/src/dashboard/views.py", 676 | "/Users/jmitch/Desktop/dm/README.md", 677 | "/Users/jmitch/Desktop/dm/src/digitalmarket/urls.py", 678 | "/Users/jmitch/Desktop/dm/src/sellers/views.py", 679 | "/Users/jmitch/Desktop/dm/src/checkout/views.py", 680 | "/Users/jmitch/Desktop/dm.md", 681 | "/Users/jmitch/Desktop/dm/src/digitalmarket/settings.py", 682 | "/Users/jmitch/Desktop/dm/LICENSE", 683 | "/Users/jmitch/Desktop/dm/src/templates/sellers/dashboard.html", 684 | "/Users/jmitch/Desktop/dm/src/sellers/mixins.py", 685 | "/Users/jmitch/Desktop/dm/src/analytics/models.py", 686 | "/Users/jmitch/Desktop/dm/src/products/mixins.py", 687 | "/Users/jmitch/Desktop/dm/src/templates/sellers/product_list_view.html", 688 | "/Users/jmitch/Desktop/dm/src/billing/models.py", 689 | "/Users/jmitch/Desktop/dm/src/sellers/urls.py", 690 | "/Users/jmitch/Desktop/dm/src/templates/sellers/transaction_list.html", 691 | "/Users/jmitch/Desktop/dm/src/templates/sellers/transaction_list_view.html", 692 | "/Users/jmitch/Desktop/dm/src/products_backup.json", 693 | "/Users/jmitch/Desktop/dm/src/billing/admin.py", 694 | "/Users/jmitch/Desktop/dm/src/sellers/admin.py", 695 | "/Users/jmitch/Desktop/dm/src/products/forms.py", 696 | "/Users/jmitch/Desktop/dm/src/templates/checkout/test.html", 697 | "/Users/jmitch/Desktop/dm/src/digitalmarket/decorators.py", 698 | "/Users/jmitch/Desktop/dm/src/static/js/django.csrf.js", 699 | "/Users/jmitch/Desktop/dm/src/templates/tags/tag_detail.html", 700 | "/Users/jmitch/Desktop/dm/src/tags/views.py", 701 | "/Users/jmitch/Desktop/dm/src/CRUD.md", 702 | "/Users/jmitch/Desktop/dm/src/templates/dashboard.html", 703 | "/Users/jmitch/Desktop/dm/src/templates/list_view.html", 704 | "/Users/jmitch/Desktop/dm/src/analytics/admin.py", 705 | "/Users/jmitch/Desktop/dm/src/products/templatetags/get_thumbnail.py", 706 | "/Users/jmitch/Desktop/dm/src/tags/models.py", 707 | "/Users/jmitch/Desktop/dm/src/tags/admin.py", 708 | "/Users/jmitch/Desktop/dm/src/tags/urls.py", 709 | "/Users/jmitch/Desktop/dm/src/templates/tags/tag_list.html" 710 | ], 711 | "find": 712 | { 713 | "height": 35.0 714 | }, 715 | "find_in_files": 716 | { 717 | "height": 0.0, 718 | "where_history": 719 | [ 720 | "/Users/jmitch/Desktop/ecommerce-2/src", 721 | "/Users/jmitch/Dropbox/projects/kpj", 722 | "/Users/jmitch/Dropbox/projects/kpj/kpj", 723 | "/Users/jmitch/Dropbox/projects/", 724 | "/Users/jmitch/Dropbox/projects/kpj/kpj", 725 | "", 726 | "/Users/jmitch/Dropbox/projects/kpj/kpj", 727 | "/Users/jmitch/Dropbox/projects/kpj", 728 | "/Users/jmitch/Dropbox/cfe/src" 729 | ] 730 | }, 731 | "find_state": 732 | { 733 | "case_sensitive": false, 734 | "find_history": 735 | [ 736 | "$http", 737 | "get_transactions", 738 | "ProductUpdateView", 739 | "delete all", 740 | "jmitch-#", 741 | "AddressSelectFormView", 742 | "order_address", 743 | "\"", 744 | "item_it", 745 | "trydjango18", 746 | "questions_notification", 747 | "app.task", 748 | "needs_rep", 749 | "sendgrid", 750 | "celerybeat-schedule.db", 751 | "get_next_lecture", 752 | "lecture_quiz_result", 753 | "quiz", 754 | "url", 755 | "reverse", 756 | "module-box", 757 | "slug", 758 | "lang", 759 | "send_mail", 760 | "get_user", 761 | "ppe_4", 762 | "as_view", 763 | "\"join\"", 764 | "saftey", 765 | "Saftey Trianing i", 766 | "Training on new pesticides prior to first use", 767 | "transaction", 768 | "render_to", 769 | "render_to_pdf", 770 | "render_to", 771 | "DeleteView", 772 | "welcome_", 773 | "welcome", 774 | "all.html", 775 | "$.ajax", 776 | "ajax", 777 | "wistia", 778 | "upload", 779 | "review", 780 | "review now", 781 | "review_chemicals", 782 | "lectures_admin", 783 | "upload_bulk", 784 | "ChemicalsViewAdmin", 785 | "filter(active=F", 786 | "active", 787 | "LectureQuizAdminView", 788 | "formview", 789 | "$.ajax", 790 | "ajax", 791 | "clean", 792 | "keep", 793 | "questionanswer", 794 | "initial", 795 | "get_lecture", 796 | "slug", 797 | "LectureDetailView", 798 | "get_lecture", 799 | "get_next_lecture", 800 | "lecture_quiz", 801 | "edit_lecture", 802 | "single_lecture", 803 | "single", 804 | "form.as", 805 | "question.as", 806 | "question", 807 | "method", 808 | "csv", 809 | "ceu", 810 | "login", 811 | "easy", 812 | "grand", 813 | "pricing", 814 | "cost", 815 | "paginator", 816 | "question", 817 | "lecturequestion", 818 | "question", 819 | "next", 820 | "take_quiz", 821 | "after ", 822 | "href", 823 | "take_quiz", 824 | "start", 825 | "Coding", 826 | "Coding For Entrepreneurs", 827 | "Coding for Entrepreneurs", 828 | "results", 829 | "cleaned_email", 830 | "class=\"fa fa-check\"", 831 | "You are already logged in", 832 | "pricing", 833 | "login", 834 | "PasswordResetForm", 835 | "team", 836 | "team_id", 837 | "user_logged_in", 838 | "transcript", 839 | "template", 840 | "modal", 841 | "def __unicode__(self)", 842 | "def__unicode__(self)", 843 | "check", 844 | "chain", 845 | "action", 846 | "get_model", 847 | "team", 848 | "DEFAULT_FROM_EMAIL", 849 | "PasswordResetForm", 850 | "activate", 851 | "settings", 852 | "request", 853 | "reset", 854 | "checmicals", 855 | "activity", 856 | "Pag", 857 | "quiz", 858 | "middle", 859 | "user_logged_in", 860 | "create", 861 | "create_user", 862 | "MemberCreateForm", 863 | "Member" 864 | ], 865 | "highlight": false, 866 | "in_selection": false, 867 | "preserve_case": false, 868 | "regex": false, 869 | "replace_history": 870 | [ 871 | "jmitch=#", 872 | "'", 873 | "ecommerce2", 874 | "Control Guidance Solutions, LLC", 875 | "class=\"fa fa-check fa-2x\"", 876 | "img/apple-touch-icon-152.png", 877 | "{})", 878 | "render(request,", 879 | "render(", 880 | ")", 881 | "render(request,", 882 | "Coding For Entrepreneurs", 883 | "CodingForEntrepreneurs.com", 884 | "Coding For Entrepreneurs", 885 | "CodingForEntrepreneurs.com" 886 | ], 887 | "reverse": false, 888 | "show_context": false, 889 | "use_buffer2": false, 890 | "whole_word": false, 891 | "wrap": true 892 | }, 893 | "groups": 894 | [ 895 | { 896 | "selected": 0, 897 | "sheets": 898 | [ 899 | { 900 | "buffer": 0, 901 | "settings": 902 | { 903 | "buffer_size": 0, 904 | "regions": 905 | { 906 | }, 907 | "selection": 908 | [ 909 | [ 910 | 0, 911 | 0 912 | ] 913 | ], 914 | "settings": 915 | { 916 | "syntax": "Packages/Text/Plain text.tmLanguage" 917 | }, 918 | "translation.x": 0.0, 919 | "translation.y": 0.0, 920 | "zoom_level": 1.0 921 | }, 922 | "type": "text" 923 | } 924 | ] 925 | } 926 | ], 927 | "incremental_find": 928 | { 929 | "height": 25.0 930 | }, 931 | "input": 932 | { 933 | "height": 31.0 934 | }, 935 | "layout": 936 | { 937 | "cells": 938 | [ 939 | [ 940 | 0, 941 | 0, 942 | 1, 943 | 1 944 | ] 945 | ], 946 | "cols": 947 | [ 948 | 0.0, 949 | 1.0 950 | ], 951 | "rows": 952 | [ 953 | 0.0, 954 | 1.0 955 | ] 956 | }, 957 | "menu_visible": true, 958 | "output.find_results": 959 | { 960 | "height": 136.0 961 | }, 962 | "replace": 963 | { 964 | "height": 64.0 965 | }, 966 | "save_all_on_build": true, 967 | "select_file": 968 | { 969 | "height": 0.0, 970 | "selected_items": 971 | [ 972 | [ 973 | "email", 974 | "templates/team/email_instructions.html" 975 | ] 976 | ], 977 | "width": 0.0 978 | }, 979 | "select_project": 980 | { 981 | "height": 0.0, 982 | "selected_items": 983 | [ 984 | ], 985 | "width": 0.0 986 | }, 987 | "show_minimap": false, 988 | "show_open_files": true, 989 | "show_tabs": true, 990 | "side_bar_visible": true, 991 | "side_bar_width": 383.0, 992 | "status_bar_visible": true 993 | } 994 | -------------------------------------------------------------------------------- /pip-selfcheck.json: -------------------------------------------------------------------------------- 1 | {"last_check":"2016-10-26T22:48:25Z","pypi_version":"8.1.2"} -------------------------------------------------------------------------------- /src/blog/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codingforentrepreneurs/Django-Views-Unleashed/b31b644bca0fda328b24f474c27ed8acb7c86921/src/blog/__init__.py -------------------------------------------------------------------------------- /src/blog/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | from .models import PostModel 5 | 6 | 7 | admin.site.register(PostModel) 8 | -------------------------------------------------------------------------------- /src/blog/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class BlogConfig(AppConfig): 5 | name = 'blog' 6 | -------------------------------------------------------------------------------- /src/blog/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | 3 | 4 | from .models import PostModel 5 | 6 | 7 | class PostModelForm(forms.ModelForm): 8 | class Meta: 9 | model = PostModel 10 | fields = [ 11 | 'title', 12 | 'content' 13 | ] -------------------------------------------------------------------------------- /src/blog/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.10.2 on 2016-10-26 23:18 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | import django.utils.timezone 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | initial = True 12 | 13 | dependencies = [ 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='PostModel', 19 | fields=[ 20 | ('id', models.BigAutoField(primary_key=True, serialize=False)), 21 | ('active', models.BooleanField(default=True)), 22 | ('title', models.CharField(error_messages={'blank': 'This field is not full, please try again.', 'unique': 'This title is not unique, please try again.'}, help_text='Must be a unique title.', max_length=240, unique=True, verbose_name='Post title')), 23 | ('slug', models.SlugField(blank=True, null=True)), 24 | ('content', models.TextField(blank=True, null=True)), 25 | ('publish', models.CharField(choices=[('draft', 'Draft'), ('publish', 'Publish'), ('private', 'Private')], default='draft', max_length=120)), 26 | ('view_count', models.IntegerField(default=0)), 27 | ('publish_date', models.DateField(default=django.utils.timezone.now)), 28 | ('author_email', models.EmailField(blank=True, max_length=240, null=True)), 29 | ('updated', models.DateTimeField(auto_now=True)), 30 | ('timestamp', models.DateTimeField(auto_now_add=True)), 31 | ], 32 | options={ 33 | 'verbose_name_plural': 'Posts', 34 | 'verbose_name': 'Post', 35 | }, 36 | ), 37 | ] 38 | -------------------------------------------------------------------------------- /src/blog/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codingforentrepreneurs/Django-Views-Unleashed/b31b644bca0fda328b24f474c27ed8acb7c86921/src/blog/migrations/__init__.py -------------------------------------------------------------------------------- /src/blog/models.py: -------------------------------------------------------------------------------- 1 | from datetime import timedelta, datetime, date 2 | 3 | from django.db import models 4 | from django.db.models.signals import pre_save, post_save 5 | from django.utils.encoding import smart_text 6 | from django.utils import timezone 7 | from django.utils.text import slugify 8 | from django.utils.timesince import timesince 9 | 10 | 11 | # Create your models here. 12 | 13 | 14 | #from .validators import validate_author_email, validate_justin 15 | 16 | PUBLISH_CHOICES = [ 17 | ('draft', 'Draft'), 18 | ('publish', 'Publish'), 19 | ('private', 'Private'), 20 | ] 21 | 22 | class PostModelQuerySet(models.query.QuerySet): 23 | def active(self): 24 | return self.filter(active=True) 25 | 26 | def post_title_items(self, value): 27 | return self.filter(title__icontains=value) 28 | 29 | 30 | class PostModelManager(models.Manager): 31 | def get_queryset(self): 32 | return PostModelQuerySet(self.model, using=self._db) 33 | 34 | def all(self, *args, **kwargs): 35 | #qs = super(PostModelManager, self).all(*args, **kwargs).active() #.filter(active=True) 36 | #print(qs) 37 | qs = self.get_queryset().active() 38 | return qs 39 | 40 | def get_timeframe(self, date1, date2): 41 | #assume datetime objects 42 | qs = self.get_queryset() 43 | qs_time_1 = qs.filter(publish_date__gte=date1) 44 | qs_time_2 = qs_time_1.filter(publish_date__lt=date2) # Q Lookups 45 | #final_qs = (qs_time_1 | qs_time_2).distinct() 46 | return qs_time_2 47 | 48 | class PostModel(models.Model): 49 | id = models.BigAutoField(primary_key=True) 50 | active = models.BooleanField(default=True) #empty in the database 51 | title = models.CharField( 52 | max_length=240, 53 | verbose_name='Post title', 54 | unique=True, 55 | error_messages={ 56 | "unique": "This title is not unique, please try again.", 57 | "blank": "This field is not full, please try again." 58 | }, 59 | help_text='Must be a unique title.') 60 | slug = models.SlugField(null=True, blank=True) 61 | content = models.TextField(null=True, blank=True) 62 | publish = models.CharField(max_length=120, choices=PUBLISH_CHOICES, default='draft') 63 | view_count = models.IntegerField(default=0) 64 | publish_date = models.DateField(auto_now=False, auto_now_add=False, default=timezone.now) 65 | author_email = models.EmailField(max_length=240, null=True, blank=True) 66 | updated = models.DateTimeField(auto_now=True) 67 | timestamp = models.DateTimeField(auto_now_add=True) 68 | 69 | objects = PostModelManager() 70 | other = PostModelManager() 71 | #save = PostModelManager() 72 | 73 | def save(self, *args, **kwargs): 74 | # if not self.slug and self.title: 75 | # self.slug = slugify(self.title) 76 | super(PostModel, self).save(*args, **kwargs) 77 | 78 | class Meta: 79 | verbose_name = 'Post' 80 | verbose_name_plural = 'Posts' 81 | #unique_together = [('title', 'slug')] 82 | 83 | def __unicode__(self): #python 2 84 | return smart_text(self.title) #self.title 85 | 86 | def __str__(self): #python 3 87 | return smart_text(self.title) 88 | 89 | @property 90 | def age(self): 91 | if self.publish == 'publish': 92 | now = datetime.now() 93 | publish_time = datetime.combine( 94 | self.publish_date, 95 | datetime.now().min.time() 96 | ) 97 | try: 98 | difference = now - publish_time 99 | except: 100 | return "Unknown" 101 | if difference <= timedelta(minutes=1): 102 | return 'just now' 103 | return '{time} ago'.format(time= timesince(publish_time).split(', ')[0]) 104 | return "Not published" 105 | 106 | 107 | 108 | def blog_post_model_pre_save_receiver(sender, instance, *args, **kwargs): 109 | print("before save") 110 | if not instance.slug and instance.title: 111 | instance.slug = slugify(instance.title) 112 | 113 | pre_save.connect(blog_post_model_pre_save_receiver, sender=PostModel) 114 | 115 | 116 | 117 | def blog_post_model_post_save_receiver(sender, instance, created, *args, **kwargs): 118 | print("after save") 119 | print(created) 120 | if created: 121 | if not instance.slug and instance.title: 122 | instance.slug = slugify(instance.title) 123 | instance.save() 124 | 125 | post_save.connect(blog_post_model_post_save_receiver, sender=PostModel) 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | ''' 134 | python manage.py makemigrations #every time you change models.py 135 | python manage.py migate 136 | 137 | 138 | ModelForm 139 | forms.CharField(max_length=120, choices=PUBLISH_CHOICES, default='draft') 140 | 141 | ''' -------------------------------------------------------------------------------- /src/blog/templates/blog/create-view.html: -------------------------------------------------------------------------------- 1 | {% if messages %} 2 | 7 | {% endif %} 8 | 9 | 10 |

Create new Post

11 | 12 | 13 |
{% csrf_token %} 14 | {{ form.as_p }} 15 | 16 | 17 |
-------------------------------------------------------------------------------- /src/blog/templates/blog/delete-view.html: -------------------------------------------------------------------------------- 1 |

Delete {{ object.title }}?

2 | 3 | 4 |
{% csrf_token %} 5 | Are you sure you want to delete this post? 6 | 7 | 8 | 9 | Cancel 10 | 11 |
-------------------------------------------------------------------------------- /src/blog/templates/blog/detail-view.html: -------------------------------------------------------------------------------- 1 | {% include "blog/search-blog.html" %} 2 | 3 | 4 | {% if messages %} 5 | 10 | {% endif %} 11 | 12 |

{{ object.title }}

13 | 14 | 15 | {{ object.content }} -------------------------------------------------------------------------------- /src/blog/templates/blog/list-view-public.html: -------------------------------------------------------------------------------- 1 |

Hello there!

-------------------------------------------------------------------------------- /src/blog/templates/blog/list-view.html: -------------------------------------------------------------------------------- 1 | {% if messages %} 2 | 7 | {% endif %} 8 | 9 | {% include "blog/search-blog.html" %} 10 | 11 |

Hello World

12 | 13 | 14 | {% for object in object_list %} 15 |
  • 16 | {{ object.title }} 17 | 19 | 20 |
  • 21 | {% endfor %} 22 | 23 | 24 | {{ array_list }} 25 | 26 | {{ num }} 27 | 28 | 29 | {{ boolean_value }} -------------------------------------------------------------------------------- /src/blog/templates/blog/search-blog.html: -------------------------------------------------------------------------------- 1 |
    2 | 3 |
    -------------------------------------------------------------------------------- /src/blog/templates/blog/update-view.html: -------------------------------------------------------------------------------- 1 |

    Update {{ object.title }}

    2 | 3 | {{ form.instance.title }} 4 | 5 |
    {% csrf_token %} 6 | {{ form.as_p }} 7 | 8 | 9 |
    -------------------------------------------------------------------------------- /src/blog/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /src/blog/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls import url 2 | 3 | 4 | from .views import ( 5 | post_model_create_view, 6 | post_model_detail_view, 7 | post_model_delete_view, 8 | post_model_list_view, 9 | post_model_update_view 10 | ) 11 | 12 | urlpatterns = [ 13 | url(r'^$', post_model_list_view, name='list'), 14 | url(r'^create/$', post_model_create_view, name='create'), 15 | url(r'^(?P\d+)/$', post_model_detail_view, name='detail'), 16 | url(r'^(?P\d+)/delete/$', post_model_delete_view, name='delete'), 17 | url(r'^(?P\d+)/edit/$', post_model_update_view, name='update'), 18 | #url(r'^admin/', admin.site.urls), 19 | #url(r'^$', home, name='home'), 20 | #url(r'^redirect/$', redirect_somewhere, name='home') 21 | ] 22 | -------------------------------------------------------------------------------- /src/blog/views.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.decorators import login_required 2 | from django.contrib import messages 3 | from django.db.models import Q 4 | from django.http import HttpResponse, Http404, HttpResponseRedirect 5 | from django.shortcuts import render, get_object_or_404 6 | 7 | # Create your views here. 8 | 9 | from .forms import PostModelForm 10 | from .models import PostModel 11 | 12 | #@login_required 13 | def post_model_create_view(request): 14 | form = PostModelForm(request.POST or None) 15 | context = { 16 | "form": form 17 | } 18 | if form.is_valid(): 19 | obj = form.save(commit=False) 20 | #print(obj.title) 21 | obj.save() 22 | messages.success(request, "Created a new blog post!") 23 | context = { 24 | "form": PostModelForm() 25 | } 26 | #return HttpResponseRedirect("/blog/{num}".format(num=obj.id)) 27 | 28 | template = "blog/create-view.html" 29 | return render(request, template, context) 30 | 31 | #@login_required 32 | def post_model_update_view(request, id=None): 33 | obj = get_object_or_404(PostModel, id=id) 34 | form = PostModelForm(request.POST or None, instance=obj) 35 | context = { 36 | "form": form 37 | } 38 | if form.is_valid(): 39 | obj = form.save(commit=False) 40 | #print(obj.title) 41 | obj.save() 42 | messages.success(request, "Updated post!") 43 | return HttpResponseRedirect("/blog/{num}".format(num=obj.id)) 44 | 45 | template = "blog/update-view.html" 46 | return render(request, template, context) 47 | 48 | 49 | def post_model_detail_view(request, id=None): 50 | obj = get_object_or_404(PostModel, id=id) 51 | context = { 52 | "object": obj, 53 | } 54 | template = "blog/detail-view.html" 55 | return render(request, template, context) 56 | 57 | 58 | 59 | def post_model_delete_view(request, id=None): 60 | obj = get_object_or_404(PostModel, id=id) 61 | if request.method == "POST": 62 | obj.delete() 63 | messages.success(request, "Post deleted") 64 | return HttpResponseRedirect("/blog/") 65 | context = { 66 | "object": obj, 67 | } 68 | template = "blog/delete-view.html" 69 | return render(request, template, context) 70 | 71 | 72 | def post_model_list_view(request): 73 | #query = request.GET["q"] 74 | query = request.GET.get("q", None) 75 | qs = PostModel.objects.all() 76 | if query is not None: 77 | qs = qs.filter( 78 | Q(title__icontains=query) | 79 | Q(content__icontains=query) | 80 | Q(slug__icontains=query) 81 | ) 82 | context = { 83 | "object_list": qs, 84 | } 85 | template = "blog/list-view.html" 86 | return render(request, template, context) 87 | 88 | 89 | 90 | @login_required(login_url='/login/') 91 | def login_required_view(request): 92 | print(request.user) 93 | qs = PostModel.objects.all() 94 | context = { 95 | "object_list": qs, 96 | } 97 | 98 | if request.user.is_authenticated(): 99 | template = "blog/list-view.html" 100 | else: 101 | template = "blog/list-view-public.html" 102 | #raise Http404 103 | return HttpResponseRedirect("/login") 104 | 105 | return render(request, template, context) 106 | 107 | 108 | 109 | 110 | def post_model_robust_view(request, id=None): 111 | obj = None 112 | context = {} 113 | success_message = 'A new post was created' 114 | 115 | if id is None: 116 | "obj is could be created" 117 | template = "blog/create-view.html" 118 | else: 119 | "obj prob exists" 120 | obj = get_object_or_404(PostModel, id=id) 121 | success_message = 'A new post was created' 122 | context["object"] = obj 123 | template = "blog/detail-view.html" 124 | if "edit" in request.get_full_path(): 125 | template = "blog/update-view.html" 126 | if "delete" in request.get_full_path(): 127 | template = "blog/delete-view.html" 128 | if request.method == "POST": 129 | obj.delete() 130 | messages.success(request, "Post deleted") 131 | return HttpResponseRedirect("/blog/") 132 | 133 | #if "edit" in request.get_full_path() or "create" in request.get_full_path(): 134 | form = PostModelForm(request.POST or None, instance=obj) 135 | context["form"] = form 136 | if form.is_valid(): 137 | obj = form.save(commit=False) 138 | obj.save() 139 | messages.success(request, success_message) 140 | if obj is not None: 141 | return HttpResponseRedirect("/blog/{num}".format(obj.id)) 142 | context["form"] - PostModelForm() 143 | return render(request, template, context) 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | -------------------------------------------------------------------------------- /src/db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codingforentrepreneurs/Django-Views-Unleashed/b31b644bca0fda328b24f474c27ed8acb7c86921/src/db.sqlite3 -------------------------------------------------------------------------------- /src/djviews/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codingforentrepreneurs/Django-Views-Unleashed/b31b644bca0fda328b24f474c27ed8acb7c86921/src/djviews/__init__.py -------------------------------------------------------------------------------- /src/djviews/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for djviews project. 3 | 4 | Generated by 'django-admin startproject' using Django 1.10.2. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.10/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/1.10/ref/settings/ 11 | """ 12 | 13 | import os 14 | 15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = '*d=zv8q*vq*g7iiz-ga3%)ir+)e7bmf)1vw0c#c^(5!(@+##m=' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = [] 29 | LOGIN_URL = "/login/" 30 | 31 | # Application definition 32 | 33 | INSTALLED_APPS = [ 34 | 'django.contrib.admin', 35 | 'django.contrib.auth', 36 | 'django.contrib.contenttypes', 37 | 'django.contrib.sessions', 38 | 'django.contrib.messages', 39 | 'django.contrib.staticfiles', 40 | 41 | 'blog', 42 | ] 43 | 44 | MIDDLEWARE = [ 45 | 'django.middleware.security.SecurityMiddleware', 46 | 'django.contrib.sessions.middleware.SessionMiddleware', 47 | 'django.middleware.common.CommonMiddleware', 48 | 'django.middleware.csrf.CsrfViewMiddleware', 49 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 50 | 'django.contrib.messages.middleware.MessageMiddleware', 51 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 52 | ] 53 | 54 | ROOT_URLCONF = 'djviews.urls' 55 | 56 | TEMPLATES = [ 57 | { 58 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 59 | 'DIRS': [], 60 | 'APP_DIRS': True, 61 | 'OPTIONS': { 62 | 'context_processors': [ 63 | 'django.template.context_processors.debug', 64 | 'django.template.context_processors.request', 65 | 'django.contrib.auth.context_processors.auth', 66 | 'django.contrib.messages.context_processors.messages', 67 | ], 68 | }, 69 | }, 70 | ] 71 | 72 | WSGI_APPLICATION = 'djviews.wsgi.application' 73 | 74 | 75 | # Database 76 | # https://docs.djangoproject.com/en/1.10/ref/settings/#databases 77 | 78 | DATABASES = { 79 | 'default': { 80 | 'ENGINE': 'django.db.backends.sqlite3', 81 | 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 82 | } 83 | } 84 | 85 | 86 | # Password validation 87 | # https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators 88 | 89 | AUTH_PASSWORD_VALIDATORS = [ 90 | { 91 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 92 | }, 93 | { 94 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 95 | }, 96 | { 97 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 98 | }, 99 | { 100 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 101 | }, 102 | ] 103 | 104 | 105 | # Internationalization 106 | # https://docs.djangoproject.com/en/1.10/topics/i18n/ 107 | 108 | LANGUAGE_CODE = 'en-us' 109 | 110 | TIME_ZONE = 'UTC' 111 | 112 | USE_I18N = True 113 | 114 | USE_L10N = True 115 | 116 | USE_TZ = True 117 | 118 | 119 | # Static files (CSS, JavaScript, Images) 120 | # https://docs.djangoproject.com/en/1.10/howto/static-files/ 121 | 122 | STATIC_URL = '/static/' 123 | -------------------------------------------------------------------------------- /src/djviews/urls.py: -------------------------------------------------------------------------------- 1 | """djviews URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/1.10/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.conf.urls import url, include 14 | 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) 15 | """ 16 | from django.conf.urls import url, include 17 | from django.contrib import admin 18 | 19 | from blog.views import post_model_list_view 20 | 21 | from .views import home, redirect_somewhere 22 | 23 | urlpatterns = [ 24 | url(r'^admin/', admin.site.urls), 25 | url(r'^$', home, name='home'), 26 | url(r'^redirect/$', redirect_somewhere, name='home'), 27 | url(r'^blog/', include('blog.urls', namespace='blog')), #app controls all urls 28 | #url(r'^posts/$', post_model_list_view), 29 | ] 30 | -------------------------------------------------------------------------------- /src/djviews/views.py: -------------------------------------------------------------------------------- 1 | from django.http import HttpResponse, HttpResponseRedirect 2 | 3 | 4 | # Class Home 5 | 6 | # def home(request): 7 | # print(request) 8 | # print(dir(request)) 9 | # #print(request.method) 10 | # #print(request.is_ajax) 11 | # #print(request.is_ajax()) 12 | # print(request.get_full_path()) 13 | # return HttpResponse("

    Hello World

    ") 14 | 15 | 16 | def home(request): 17 | # save data 18 | 19 | response = HttpResponse(content_type='application/json') 20 | response = HttpResponse(content_type='text/html') 21 | 22 | response.content = '

    Hello World

    ' 23 | print(response.status_code) 24 | print(dir(response)) 25 | #response.write("

    Page Not Found

    ") 26 | # response.write("

    Here's the text of the Web page.

    ") 27 | # response.write("

    Here's the text of the Web page.

    ") 28 | # response.write("

    Here's the text of the Web page.

    ") 29 | # response.write("

    Here's the text of the Web page.

    ") 30 | response.status_code = 200 31 | return response 32 | 33 | 34 | def redirect_somewhere(request): 35 | return HttpResponseRedirect("/some/path") # http://joincfe.com 36 | -------------------------------------------------------------------------------- /src/djviews/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for djviews project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djviews.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /src/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djviews.settings") 7 | try: 8 | from django.core.management import execute_from_command_line 9 | except ImportError: 10 | # The above import may fail for some other reason. Ensure that the 11 | # issue is really that Django is missing to avoid masking other 12 | # exceptions on Python 2. 13 | try: 14 | import django 15 | except ImportError: 16 | raise ImportError( 17 | "Couldn't import Django. Are you sure it's installed and " 18 | "available on your PYTHONPATH environment variable? Did you " 19 | "forget to activate a virtual environment?" 20 | ) 21 | raise 22 | execute_from_command_line(sys.argv) 23 | --------------------------------------------------------------------------------