๐Ÿ‘จโ€๐Ÿ’ป
Hamin TIL
  • Today I Learned ๐Ÿง‘๐Ÿปโ€๐Ÿ’ป
  • ํšŒ๊ณ 
  • git
    • git_basics
      • Git 101
      • Git branch
      • Git_ignore
    • Git Book
    • ์šฐ์•„ํ•œํ˜•์ œ๋“ค
    • pull_request
  • db
    • DA
      • ๋ฐ์ดํ„ฐํ‘œ์ค€ํ™”
      • ๋ฐ์ดํ„ฐ_์š”๊ฑด๋ถ„์„
      • ์ „์‚ฌ์•„ํ‚คํ…์ฒ˜_์ดํ•ด
      • ๋ฐ์ดํ„ฐ๋ชจ๋ธ๋ง
    • SQL
      • SQL๊ธฐ๋ณธ๋ฐํ™œ์šฉ
        • SQLํ™œ์šฉ
          • ์ ˆ์ฐจํ˜•SQL
          • ๊ณ„์ธตํ˜•์งˆ์˜์™€์…€ํ”„์กฐ์ธ
          • DCL
          • ๊ทธ๋ฃนํ•จ์ˆ˜
          • ์œˆ๋„์šฐํ•จ์ˆ˜
          • ํ‘œ์ค€์กฐ์ธ
          • ์ง‘ํ•ฉ์—ฐ์‚ฐ์ž
          • ์„œ๋ธŒ์ฟผ๋ฆฌ
        • SQL๊ณ ๊ธ‰ํ™œ์šฉ๋ฐํŠœ๋‹
          • ์˜ตํ‹ฐ๋งˆ์ด์ €์™€์‹คํ–‰๊ณ„ํš
          • ์กฐ์ธ์ˆ˜ํ–‰์›๋ฆฌ
          • ์ธ๋ฑ์Šค๊ธฐ๋ณธ
        • SQL๊ธฐ๋ณธ
          • ํ•จ์ˆ˜
          • ๊ด€๊ณ„ํ˜•๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐœ์š”
          • GROUPBY,HAVING์ ˆ
          • DDL
          • ์กฐ์ธ
          • ORDERBY์ ˆ
          • DML
          • WHERE์ ˆ
          • TCL
      • ๋ฐ์ดํ„ฐ๋ชจ๋ธ๋ง์˜์ดํ•ด
        • ๋ฐ์ดํ„ฐ๋ชจ๋ธ๊ณผ์„ฑ๋Šฅ
          • ์ •๊ทœํ™”์˜ ์„ฑ๋Šฅ
          • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ตฌ์กฐ์™€์„ฑ๋Šฅ
          • ๋ถ„์‚ฐ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์„ฑ๋Šฅ
          • ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ
          • ๋ฐ˜์ •๊ทœํ™”์™€ ์„ฑ๋Šฅ
          • ์„ฑ๋Šฅ๋ฐ์ดํ„ฐ๋ชจ๋ธ๋ง์˜ ๊ฐœ์š”
        • ๋ฐ์ดํ„ฐ๋ชจ๋ธ๋ง์˜์ดํ•ด
          • ์‹๋ณ„์ž
          • ์†์„ฑ
          • ๊ด€๊ณ„
          • ์—”ํ„ฐํ‹ฐ
          • ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์˜ ์ดํ•ด
    • DB
  • trouble
    • libomp
    • After macOS update, git command
    • system
  • algorithm
    • BOJ
      • ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ
      • 17825-์ฃผ์‚ฌ์œ„์œท๋†€์ด
      • 14888-์—ฐ์‚ฐ์ž๋ผ์›Œ๋„ฃ๊ธฐ
      • 14503-๋กœ๋ด‡์ฒญ์†Œ๊ธฐ
      • 10157
      • 14502-์—ฐ๊ตฌ์†Œ
      • 18428-๊ฐ์‹œํ”ผํ•˜๊ธฐ
      • 14501
      • 18405-๊ฒฝ์Ÿ์ ์ „์—ผ
      • 14499-์ฃผ์‚ฌ์œ„๊ตด๋ฆฌ๊ธฐ
      • 16236-์•„๊ธฐ์ƒ์–ด
      • 15686-์น˜ํ‚จ๋ฐฐ๋‹ฌ
      • 19237-์–ด๋ฅธ์ƒ์–ด
      • 16234-์ธ๊ตฌ์ด๋™
      • 19236-์ฒญ์†Œ๋…„์ƒ์–ด
      • 1339-๋‹จ์–ด์ˆ˜ํ•™
      • ๋ฆฌ๋ชจ์ฝ˜
      • 18353 - ๋ณ‘์‚ฌ๋ฐฐ์น˜ํ•˜๊ธฐ
      • 18352-ํŠน์ •๊ฑฐ๋ฆฌ์˜๋„์‹œ์ฐพ๊ธฐ
      • 12100-2048
      • N-Queen
      • 3190-๋ฑ€
      • 11724
    • programmers
      • ์˜์–ด๋๋ง์ž‡๊ธฐ
      • ๊ธฐ๋‘ฅ๊ณผ ๋ณด
      • H - index
      • ์ •์ˆ˜์‚ผ๊ฐํ˜•
      • 2018 KAKAO BLIND RECRUITMENT - ์••์ถ•
      • ์‚ผ๊ฐ๋‹ฌํŒฝ์ด
      • ๊ฑฐ์Šค๋ฆ„๋ˆ
      • [1์ฐจ] ์…”ํ‹€๋ฒ„์Šค
    • data_structure
      • Queue
      • Graph
      • Stack
      • Hash table
    • implementation
      • dynamic_programming
      • sort
      • Least common multiple
      • dfs
      • dijkstra
      • bfs
      • binary_search
    • aps
      • notes
    • modules
  • python
    • requirements.txt
    • Jupyter notebook
    • 00_๋“ค์–ด๊ฐ€๊ธฐ ์ „์—
    • Python Virtual Environment
    • Python Syntax
  • django
    • Class Based View in Django
    • Model in Django
    • URL Name
    • Form and ModelForm
    • Authentication
    • Tips & Tricks
    • Optimization
    • Request and Response Objects
    • Templates
    • Variable Routing & DTL
    • Django REST API with JSON web token (JWT)
    • Intro to Django
    • Django REST Framework
    • Wrap-up
    • Image Upload
  • javascript
    • Ajax (Asynchronous Javascript And XML)
    • Document Object Model
    • Java Script 101
    • ES (ECMAscript)
  • java
    • Java 101
  • aws
    • beginning_cloud_computing_with_aws
      • 02 AWS ์ฃผ์š” ์„œ๋น„์Šค ์ดํ•ดํ•˜๊ธฐ
      • 01 ์•„๋งˆ์กด ์›น ์„œ๋น„์Šค Cloud ๊ฐœ์š”
  • programming
    • Communication
    • CS_์šฉ์–ด์‚ฌ์ „
  • vue.js
    • 01_Vue.js_Intro
  • data_science
    • 01_๋ฐ์ดํ„ฐ์—์„œ์ธ์‚ฌ์ดํŠธ๋ฐœ๊ฒฌํ•˜๊ธฐ
    • pandas
    • 04_๋ฐ์ดํ„ฐ๋ถ„๋ฅ˜๋ชจ๋ธ
    • 02_ํ…์ŠคํŠธ๋งˆ์ด๋‹์ฒซ๊ฑธ์Œ
    • 05_์ข…ํ•ฉ์˜ˆ์ œ
    • 03_๋ฏธ๋ž˜๋ฅผ์˜ˆ์ธกํ•˜๋Š”๋ฐ์ดํ„ฐ๋ถ„์„
    • Statistics
      • ๋ชจ์ˆ˜์™€ ์ถ”์ •๋Ÿ‰
    • ํ†ต๊ณ„ํ•™๋…ธํŠธ
  • linux
    • Linux Commands
  • ide
    • VScode
    • Pycharm
  • html,css
    • HTML 101
    • CSS 101
  • colab
    • colab_101
  • ์˜์‚ฌ๊ฒฐ์ •๋‚˜๋ฌด๋ฐ๋ชจํ˜•๋น„๊ต
Powered by GitBook
On this page
  • 1. ํ•„์š”ํ•œ package ์„ค์น˜ํ•˜๊ธฐ
  • 2. model์— image column ์ •์˜
  • 3. view์— request.FILES ์ถ”๊ฐ€
  • 4. settings.py ์ˆ˜์ •
  • 5. urls.py์— ๊ฒฝ๋กœ ์ถ”๊ฐ€
  • 6. Templates ์ˆ˜์ •
  • migrations
  • django-imagekit library
  • Installation
  • ์›๋ณธ ์ž์ฒด๋ฅผ ์ž˜๋ผ์„œ ์ €์žฅ

Was this helpful?

  1. django

Image Upload

1. ํ•„์š”ํ•œ package ์„ค์น˜ํ•˜๊ธฐ

1-1. ImageField

  • ๋‹จ์ˆœ ImageField๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” pillow ํŒจํ‚ค์ง€๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋‹ค.

$ pip install pillow

1-2. resizing

  • Resizing์„ ์œ„ํ•ด์„œ๋Š” pilkit, django-imagekit ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

$ pip install pilkit django-imagekit

2. model์— image column ์ •์˜

posts > models.py

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    image = models.ImageField(blank=True)
    # DB ์ €์žฅ x, ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด ์ž˜๋ผ์„œ ํ‘œํ˜„
    image_thumbnail = ImageSpecField(source='image',
                                      processors=[ResizeToFill(300, 300)],
                                      format='JPEG',
                                      options={'quality': 60})
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    #์ข‹์•„์š” ๊ธฐ๋Šฅ
    like_users = models.ManyToManyField(settings.AUTH_USER_MODEL,
                                    related_name='like_posts')

3. view์— request.FILES ์ถ”๊ฐ€

posts > views.py

@login_required
def create(request):
    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            post = form.save(commit=False) # ์ถ”๊ฐ€ํ•จ
            post.user = request.user
            post.save()
            return redirect('posts:index')
        messages.warning(request, 'Please check the form submitted')
    else:
        form = PostForm()
    context = {
        'form': form
    }
    return render(request, 'posts/forms.html', context)


def update(request):
    if request.method == 'POST':
        form = CustomUserChangeForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            return redirect('posts:index')
    else:
        form = CustomUserChangeForm(instance=request.user)
    context ={
        'form':form
    }
    return render(request, 'accounts/update.html', context)

4. settings.py ์ˆ˜์ •

# media file ์ €์žฅ ๊ฒฝ๋กœ
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

MEDIA_URL = '/media/'

5. urls.py์— ๊ฒฝ๋กœ ์ถ”๊ฐ€

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('posts/', include('posts.urls')),
    path('accounts/', include('accounts.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

6. Templates ์ˆ˜์ •

forms.html

<form action="" method="POST" enctype="multipart/form-data">

detail.html

    <!--image ์ถœ๋ ฅ์šฉ-->
    <img src="{{post.image.url}}"/>
    <img src="{{post.image_thumbnail.url}}"/>

migrations

$ python manage.py makemigrations
# default๊ฐ’ ์—†์ด NOT NULL๋ฅผ ์ง€์ • => ๊ธฐ์กด ๋ ˆ์ฝ”๋“œ์— ๊ฐ’์ด ํ•„์š”ํ•˜๋‹ค.
You are trying to add a non-nullable field 'image' to article without a default; we can't do that (the database needs something to populate existing rows).
# 2๊ฐ€์ง€ ์˜ต์…˜ ์ œ์‹œ
Please select a fix:
 # 1) ๋””ํดํŠธ ๊ฐ’์„ ์ง€๊ธˆ ์„ค์ • => python console
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 # 2) ์ข…๋ฃŒํ•˜๊ณ  ์ง์ ‘ models.py์— default ์„ค์ •
 2) Quit, and let me add a default in models.py
Select an option: 1
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt

django-imagekit library

Image ๋‚ด๋ถ€์ ์œผ๋กœ thumbnail์— ๋งž๊ฒŒ ์ž๋ฅด๊ธฐ

Download & usage

Installation

$ pip install pilkit django-imagekit

์›๋ณธ ์ž์ฒด๋ฅผ ์ž˜๋ผ์„œ ์ €์žฅ

ProcessedImageField(upload_to='avatars',
                                           processors=[ResizeToFill(100, 50)],
                                           format='JPEG',
                                           options={'quality': 60})
PreviousWrap-upNextjavascript

Last updated 4 years ago

Was this helpful?

https://github.com/matthewwithanm/django-imagekit