Django:
templates builtins!!!
very useful template shortcuts, tags and many more...
Class based views: Generic VIEWS
learning source:
codingforentrepreneurs
generic views official documentation
to iterate through a folder
StackO: iterate through a static image folder in django:
This isn't something Django has built in. But Django is just Python, and you can use normal Python file functions to get your list in the view:
files = os.listdir(os.path.join(settings.STATIC_ROOT, "styles/jamia"))
filter in queryset
When you know what to look for:
category_handbags = Category.objects.filter(name='Handbags')
furthur reading: Database Functions
* filter()
By using filter(), we can retrieve a QuerySet of just those books that were published within the last 90 days period, like so:
from datetime import datetime, timedelta Book.objects.filter(date_published__gte=datetime.now() - timedelta(days=90)).count() # __isnull Book.objects.filter(author__isnull=True).count() # __exact Book.objects.filter(title__exact='').count()
* exclude()
if we use the exact same date_published example above but swap out filter() for exclude(), we’d expect the resulting book count to be the inverse: from 3 of 20 to now 17 of 20:
from datetime import datetime, timedelta Book.objects.exclude(date_published__gte=datetime.now() - timedelta(days=90)).count() # combining filters Book.objects.exclude(author__isnull=True).exclude(title__exact='').count()
categories.count()
vs len(categories)
len()
loads all the data in memory then do the counting
count()
is normally faster when the data is not pre loaded
be careful not to count a queryset manager like categories.first().count()
will prompt AttributeError
; however, categories.first().subcategory_set.count()
will tell you the number of its subcategories correctly and it's the same as len(categories.first().subcategory_set.all())
, as you can see, ALL of the subcategories are read to count the length.
Django - Images:
ImageField
To add ImageField
in a model and to load the image in the database onto your web:
ref: William Vincent
ref: GeeksforGeeks
uploaded images in wrong orientation:
photos taken by phones have this problem sometimes, the post by Giovanni solved the problem:
from django.db.models.signals import post_save
from django.dispatch import receiver
from PIL import Image, ExifTags
from django.db import models
import os
class Item(models.Model):
name = ...
class ItemImage(models.Model):
item = models.ForeignKey(Item)
image = models.ImageField(upload_to='itemimages', null=True, blank=True)
# solves the problem that uploaded images are in wrong orientation
def rotate_image(filepath):
try:
image = Image.open(filepath)
for orientation in ExifTags.TAGS.keys():
if ExifTags.TAGS[orientation] == 'Orientation':
break
exif = dict(image._getexif().items())
if exif[orientation] == 3:
image = image.rotate(180, expand=True)
elif exif[orientation] == 6:
image = image.rotate(270, expand=True)
elif exif[orientation] == 8:
image = image.rotate(90, expand=True)
image.save(filepath)
image.close()
except (AttributeError, KeyError, IndexError):
# cases: image don't have getexif
pass
@receiver(post_save, sender=ItemImage, dispatch_uid="update_image_item")
def update_image(sender, instance, **kwargs):
if instance.image:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
fullpath = BASE_DIR + instanc.image.url
rotate_image(fullpath)
furture reading: FIX UPLOADED IMAGES IN PYTHON WEBAPPS
image files in image field deleted but the file remains in the MEDIA foler
Cleanup Files (and Images) On Model Delete in Django
ref: Online Retail websites
- asos: most referenced in item displaying style, categorisation filtering, most responsive
- LOUIS VUITTON: most elegant in wording and minimalistic in styling
- BOTTEGA VENETA: not responsive enough on laptop
- ACCESSORIZE LONDON: not responsive enough on laptop
- KUPIVIP: looks cheap
django-bootstrap4
containers, row and columns
containers and grid examples
col-sm-12
: when page is 'small' width, occupy 12 columns
col-md-6
: when page is 'medium' width, occupy 6 columns
col-lg-4
: when page is 'large' width, occupy 4 columns
col-4
: At ALL time, occupy 4 columns, unless other rules applied
col-md-auto
: when page is 'medium' width, occupy whatever columns remain
Default grid settings: docs/4.4/layout/grid
$grid-columns: 12;
$grid-gutter-width: 30px;
$grid-breakpoints: (
xs: 0, // Extra small screen / phone
sm: 576px, // Small screen / phone
md: 768px, // Medium screen / tablet
lg: 992px, // Large screen / desktop
xl: 1200px // Extra large screen / wide desktop
);
$container-max-widths: (
sm: 540px,
md: 720px,
lg: 960px,
xl: 1140px
);
Simply Python:
to iterate through a dictionary:
dict.keys()
method and dict.items()
method
# using dict.keys() method
D1 = {1:'a', 2:'b', 3:'c'}
for key in D1.keys():
print(k, D1[k])
# 1 a
# 2 b
# 3 c
# using dict.items() method
for key, value in D1.items()
print(key, value)
# same result
Top comments (0)