рдЖрдЬ, рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдореЗрдВ, рддреИрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рдмреНрд▓реЙрдХреЛрдВ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдмреНрд▓реЙрдХ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рдЬреЛрдбрд╝рдирд╛, рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЬрд┐рддрдиреЗ рдЕрдзрд┐рдХ рдмреНрд▓реЙрдХ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЙрддрдиреЗ рд╣реА рд╡рд┐рд╡рд┐рдз рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдХрднреА-рдХрднреА рдмреНрд▓реЙрдХ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╕рд╛рде рдХрдИ рдЕрдиреНрдп рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдпреЗ рдмреНрд▓реЙрдХ рд╕реНрд╡рдпрдВ рд╕рдорд╛рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рдмреНрд▓реЙрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдЗрдореЗрдЬ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдЬреИрд╕реА рд╕рд░реНрд╡рд┐рд╕ рдмрдирд╛рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИ? рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдкрд╣рд▓реЗ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рдерд╛ред рд▓реЗрдХрд┐рди рдкреНрд░рдЧрддрд┐ рдЕрднреА рднреА рдЦрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдХреЗ рд▓рд┐рдП, рдЕрдм рдЖрдк рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА Uploadcare рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдмрд╛рдд рдХреА рдереА ред рдпрд╣ рдПрдХ рдРрд╕реА рд╕реЗрд╡рд╛ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреА рд╣реИ: рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб, рднрдВрдбрд╛рд░рдг, рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рд╡рд┐рддрд░рдгред рд╣рдо рдЗрд╕реЗ рдореБрдЦреНрдп рдЗрдХрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдкрд╛рдпрдерди рдХреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реВрдВ, рджреВрд╕рд░реА рдмрд╛рдд,
рдкреНрдпреВрдкреЛрдбреЗрдХреЗрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА
рдХреЛ рдкрд╣рд▓реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдкрд▓реЛрдбрдХреЗрдпрд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ, рдФрд░ рд╡реЗ рд╕рднреА рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рдореЗрдВ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреЛрдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдпрд╣ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╛ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЬреЛрдбрд╝реЗрдВред
рдЖрдЗрдП Django рдкрд░ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВ:
$ pip install django pyuploadcare==0.19 $ django-admin.py startproject upload_test $ cd upload_test/ && chmod u+x ./manage.py $ ./manage.py startapp imageshare $ ./manage.py syncdb --noinput
рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ, рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ INSTALLED_APPS рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдФрд░ рдирд┐рдЬреА рдХреБрдВрдЬреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
UPLOADCARE = { 'pub_key': 'demopublickey', 'secret': 'demoprivatekey', }
рдореИрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдореЛ рдЕрдХрд╛рдЙрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рддрд░реНрдХрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕ рдЦрд╛рддреЗ рдХреА рдПрдХрдорд╛рддреНрд░ рд╕реАрдорд╛ рдпрд╣ рд╣реИ рдХрд┐ рдлрд╛рдЗрд▓реЗрдВ рдХреБрдЫ рд╕рдордп рдмрд╛рдж рд╕реНрд╡рдпрдВ рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИрдВред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛рдлреА рдЫреЛрдЯреА рд╣реЛрдЧреА: рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдПрдХ рдбрд╛рдЙрдирд▓реЛрдб рдлреЙрд░реНрдо рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рдЫрд╡рд┐ рдХрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рдореЙрдбрд▓ рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
import string import random from pyuploadcare.dj import ImageField from django.db import models class Image(models.Model): slug = models.SlugField(max_length=10, primary_key=True, blank=True) image = ImageField(manual_crop="") def save(self, *args, **kwargs): if not self.slug: self.slug = ''.join(random.sample(string.ascii_lowercase, 6)) super(Image, self).save(*args, **kwargs)
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, ImageField Djungian рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди pyuploadcare рдкреИрдХреЗрдЬ рд╕реЗред рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдПрдХ рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛: рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЙрд╕ рдЫрд╡рд┐ рдХрд╛ рдХреНрд╖реЗрддреНрд░ рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬрд┐рд╕реЗ рд╡рд╣ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рд╕рд╣реЗрдЬреЗрдВ () рд╡рд┐рдзрд┐ рдПрдХ рдЫреЛрдЯреЗ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд▓рдЧ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИред
рдЕрдм рд╕реБрдВрджрд░: рдЫрд╡рд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореБрдЦреНрдп рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╢реНрдп, рдФрд░ рдПрдХ рджреГрд╢реНрдп рдЬреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
from django.views.generic import DetailView from django.views.generic.edit import CreateView from .models import Image class UploadView(CreateView): model = Image class ImageView(DetailView): model = Image
рдХрдХреНрд╖рд╛, 2 рдкрдВрдХреНрддрд┐ред рд╕рд┐рд░реНрдл Django рднреА рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рдмреНрд▓реЙрдХ рд╣реИред рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЫреЛрдЯреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╡рд┐рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЯреИрдЧ рдореЗрдВ {{form.media}} рдбрд╛рд▓рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВред рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред
{% extends "base.html" %} {% block head %} <script> UPLOADCARE_PUBLIC_KEY = 'demopublickey'; </script> {{ form.media }} {% endblock %} {% block body %} <div class="center"> <form action="." method="post"> <p>Please, select an image:</p> <p>{{ form.image }}</p> <p><input type="submit" value="send"></p> {{ form.errors }} </form> </div> {% endblock %}
рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдкреГрд╖реНрда рдкрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЪрдпрди рд╡рд┐рдЬреЗрдЯ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рд╕рдВрд░рдХреНрд╖рдг рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛрдВрдЧрд╛ рдХрд╕рдо рдЦрд╛рддрд╛ рд╣реИ: "рдХреЛрдИ URL рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ"ред рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЪрд┐рддреНрд░ рдХрд╛ рдкреВрд░реНрдг рд▓рд┐рдВрдХ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рдФрд░ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред
@models.permalink def get_absolute_url(self): return 'detail', (), {'pk': self.pk}
рдпрд╣ рдкреВрд░реНрдг рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
{% block body %} <img src="{{ image.image }}"> {% endblock %}
рдореЗрд░реЗ рдЗрдВрд╕реНрдЯрд╛рдЧреНрд░рд╛рдо рдХреЗ рд▓реЛрдЧ рд╣реИрд▓реЛ рдХрд╣рддреЗ рд╣реИрдВред

рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ рдзреНрдпрд╛рди рджреЗрдЧрд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХрддрдо 15 рдорд┐рдирдЯ рд▓рдЧ рдЧрдПред рдбрдмреНрд▓реНрдпреВрдЯреАрдПрдл, рд╣рдореЗрдВ рдПрдХ рдФрд░ рддрд┐рдорд╛рд╣реА рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
рдЖрдк рдбрд╛рдЙрдирд▓реЛрдб рдкреГрд╖реНрда рдХреЛ рд╕реБрдзрд╛рд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди рд░реВрдк рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╣реЛрддреЗ рд╣реИрдВ: рд╡рд┐рдЬреЗрдЯ рдЦреЛрд▓рдиреЗ рдФрд░ рдлрд╝реЙрд░реНрдо рдЬрдорд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдкреАрдЖрдИ рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
<script> (function() { uploadcare.start(); var widget = uploadcare.Widget('#id_image'); widget.openDialog(); widget.onChange(function(file) { if (file) { var form = document.getElementById('upload-form'); form.submit(); form.style.display = 'none'; } }); })(); </script>
рдпрд╣рд╛рдВ рд╣рдо рдкреНрд░рд╛рд░рдВрдн () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╡рд┐рдЬреЗрдЯ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ, рдкреЗрдЬ рд▓реЛрдб рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛, рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдВрд╡рд╛рдж рдЦреЛрд▓реЗрдВред рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдереА, рддреЛ рдлреЙрд░реНрдо рдЬрдорд╛ рдХрд░реЗрдВред
рдФрд░ рдХреНрдпрд╛? рдЖрдк рдЪрд┐рддреНрд░ рджреЗрдЦрдиреЗ рдХреЗ рдкреГрд╖реНрда рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ: рдкреВрд░реА рддрд╕реНрд╡реАрд░ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рджрд┐рдЦрд╛рдПрдВ рдФрд░ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред
{% block body %} <h2>Uploaded Image</h2> <a href="{{ image.image.cdn_url }}"> <img align="left" src="{{ image.image.cdn_url }}-/stretch/off/-/resize/260x/"></a> <div class="float-info"> <p> <b>Filename</b>: {{ image.image.info.filename }}<br> <b>Uploaded</b>: {{ image.image.info.datetime_uploaded|slice:":10" }}<br> <b>Original size</b>: {{ image.image.info.size|filesizeformat }}<br> </p> <p><a href="{{ image.image.cdn_url }}">Full link</a></p> </div> <br clear="left"> <p><a href="{% url 'index' %}">Upload another image</a></p> {% endblock %}
рд╡рд╛рдВрдЫрд┐рдд рдЖрдХрд╛рд░ рдХрд╛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╕реАрдзреЗ рдЫрд╡рд┐ url рдореЗрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реВрдЪрдирд╛ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, datetime_uploaded рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдзреЛрдЦрд╛ рджреЗрдирд╛ рдкрдбрд╝рд╛ - рдкрд╣рд▓реЗ 10 рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдХрд╛рдЯ рджрд┐рдпрд╛ред рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЬрд░реВрд░реА рдерд╛ред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рджрд╕ рд╣рдЬрд╛рд░ рд╡рд░реНрд╖ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд╣реА рд╣реЛ рдЬрд╛рдПрдЧрд╛ :)

рдПрдХ рдФрд░ рдЫреЛрдЯреА рдЪреАрдЬ рдЬреЛ рдареАрдХ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рд╡рд╣ рд╣реИ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдареАрдХ рд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдЬрдм рддрд╕реНрд╡реАрд░ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд╛ рдорддрд▓рдм 500 рдХреЗ рдмрдЬрд╛рдп 404 рдХреА рддреНрд░реБрдЯрд┐ рджреЗрдирд╛ рд╣реИред рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ: рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ, рдФрд░ рдпрджрд┐ рдпрд╣ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рд╣рдЯрд╛ рджреА рдЧрдИ рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣реАрдд рд▓рд┐рдВрдХ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрд╣реБрдд рдкрд╣рд▓реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдПрдкреА рдХреБрдЫ рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдорд╛рдорд▓реЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
class ImageView(DetailView): model = Image def get_object(self): object = super(ImageView, self).get_object() try: if object.image.is_removed: raise ValueError('File was deleted.') except (InvalidRequestError, ValueError): object.delete() raise Http404 return object
рдЕрдм, рд╢рд╛рдпрдж, рдЖрдк рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЖрдЦрд┐рд░реА рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ - рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд▓реЛрдб рд╣рд░реНрдХреЛ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреА рдореБрдлреНрдд - рдФрд░ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ:
iamshare.herokuapp.com ред
рд╕реНрд░реЛрдд рдХреЛрдб рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ рдпрджрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рджреЗрдЦрдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реИред