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 এভাবে সেভ করেছি তাই মিডিয়া সেটিং ও ঐভাবে করতে হবে।