Image Upload

django দিয়ে আমরা যেভাবে খুব সহজে ইমেজ আপলোড করতে পারি mongodb যখন django এর সাথে কাজ করবে তখন একটু ঘুরিয়ে কাজ করতে হবে তবে কঠিন কিছু না।

মনেকরি আমাদের Post নামে একটি মডেল আছে যার ডেটা আমরা mongodb তে store করি।

আমরা এই মডেল এ শুধু ইমেজ এর নাম সংরক্ষণ করে mongodb তে রাখবো (photoname )

class Post(Document) :
    title=StringField(max_length=200,blank=False)      
    content = StringField(blank=False)
    categories = ReferenceField(Category,default=Category.objects.first())
    tags= ListField(ReferenceField(Tags))    
    author = StringField(blank=True)
    created= DateField(default=datetime.today())
    photoname = StringField(max_length=255, blank=True)  # Store the photo filename

আমরা আমাদের forms.py তে এক্সট্রা একটি ফিল্ড নেব ইমেজ আপলোড করার জন্য যেই ফিল্ড তা আমাদের মডেল এ নেই।

from .models import Post            
class PostForm(DocumentForm)   :
    content = StringField()
    photo = forms.ImageField()  # Add the photo field

    class Meta:
        model=  Post
        exclude=['author','photoname','created']      

photo = forms.ImageField() এই ফিল্ডটা আমাদের মডেল এ নেই আমরা ফর্মের মাদ্ধমে ইমেজ আপলোড করে ইমেজের নামটি ফর্ম সাবমিট করার সময় আমাদের মডেলের photoname ফিল্ডে সেট করলে ইমেজের নামটি mongodb ডেটাবেজ এ সেভ হবে।

import os
from django.conf import settings
@login_required
def create_post(request) :
    if request.method=='POST':
        form   = PostForm(request.POST, request.FILES)
        if form.is_valid():
            # Create a new Post instance and set the author to the current user
            post = form.save(commit=False)
            post.author = request.user.username  # Set the author to the currently logged-in user        
            
            # Save the image file
            photo_file = form.cleaned_data['photo']
            with open(os.path.join(settings.MEDIA_ROOT, photo_file.name), 'wb') as f:
                for chunk in photo_file.chunks():
                    f.write(chunk)  
                    
            post.photoname ='assets/media/'+ photo_file.name                 
            post.save()
            return redirect('home')
    else:
        form = PostForm()
        return render(request,'post/form.html',{'form':form}) 

উপরের কোড অনুযায়ী ডেটাবেজ এ photoname ফিল্ডটি 'assets/media/' এর সাথে আপলোড করা ইমেজের নাম যোগ হয়ে সেভ হবে। যেমন ইমেজ এর নাম যদি হয় python.png তাহলে সেভ হবে assets/media/ python.png

ইমেজটি settings.MEDIA_ROOT অনুযায়ী আপলোড হবে যেহেতু ইমেজ এর লিংক assets/media/ python.png এভাবে সেভ করেছি তাই মিডিয়া সেটিং ও ঐভাবে করতে হবে।

import os
STATIC_URL = 'mblogstatic/'
STATICFILES_DIRS = [
    BASE_DIR / 'mblogstatic',
]
STATIC_ROOT = os.path.join(BASE_DIR, 'assets')

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'mblogstatic/assets/media')

আমাদের static ফোল্ডারের মধ্যে সেট করলাম

এবার html টেম্পলেট এ নিচের মত করে শো করবো।

{% for post in posts%}
  <img loading="lazy" src="{% static post.photoname %}" class="img-fluid" alt="{{ post.photoname }}">
  {% endfor %} 

Last updated