জ্যাঙ্গো মডেলফর্ম: সেভ (কমিট = মিথ্যা) কিসের জন্য ব্যবহৃত হয়?


90

আমি কেন save(commit=False)কেবল ModelFormসাবক্লাস থেকে একটি ফর্ম অবজেক্ট তৈরির পরিবর্তে এবং is_valid()ফর্ম এবং মডেল উভয়কে বৈধতা দেওয়ার জন্য ব্যবহার করব?

অন্য কথায়, কি save(commit=False)জন্য?

যদি আপনি কিছু মনে করেন না, আপনি কি ছেলেরা অনুমানমূলক পরিস্থিতি প্রদান করতে পারেন যেখানে এটি কার্যকর হতে পারে?

উত্তর:


111

আপনি যখন কোনও ফর্ম থেকে আপনার বেশিরভাগ মডেল ডেটা পাবেন তখন এটি দরকারী, তবে null=Falseঅ-ফর্ম ডেটা সহ কয়েকটি ক্ষেত্র তৈরি করতে হবে।

কমিট = জাল দিয়ে সংরক্ষণ করা আপনাকে একটি মডেল অবজেক্ট দেয়, তারপরে আপনি আপনার অতিরিক্ত ডেটা যুক্ত করতে এবং এটি সংরক্ষণ করতে পারেন।

এটি সেই পরিস্থিতির একটি উত্তম উদাহরণ।


তবে তারপরে যদি এটি আপনাকে একটি মডেল অবজেক্ট পায়, তবে এটি পূর্বের ইনস্ট্যান্টিয়েটেড কোনও বিষয় নির্ধারণ করে এবং এটি মডেলফর্মকে বরাদ্দ করার থেকে কীভাবে আলাদা? (ie form = forms.SampleForm(instance = models.Sample))
ওজজি দ্য জায়ান্ট

আপনি commit=Falseযদি আপনার ফর্মটি CBVসাথে প্রক্রিয়াকরণ করছেন তবে আপনার কি দরকার def form_valid? আপনি কি শুধু form.instance.[field]আপডেট করতে ব্যবহার করতে পারেন ?
ওরফে ৫১

চলুন 100:
দানি হেরেরে

43

এখানে এটি উত্তর ( ডক্স থেকে ):

# Create a form instance with POST data.
>>> f = AuthorForm(request.POST)

# Create, but don't save the new author instance.
>>> new_author = f.save(commit=False)

সর্বাধিক সাধারণ পরিস্থিতি হ'ল উদাহরণটি ফর্ম থেকে পাওয়া তবে কেবল 'স্মৃতিতে', ডাটাবেসে নয়। এটি সংরক্ষণ করার আগে আপনি কিছু পরিবর্তন করতে চান:

# Modify the author in some way.
>>> new_author.some_field = 'some_value'

# Save the new instance.
>>> new_author.save()

4
আপনি commit=Falseযদি আপনার ফর্মটি CBVসাথে প্রক্রিয়াকরণ করছেন তবে আপনার কি দরকার def form_valid? আপনি কি শুধু form.instance.[field]আপডেট করতে ব্যবহার করতে পারেন ?
ওরফে ৫১

15

জ্যাঙ্গো ডক্স থেকে:

এই সংরক্ষণ () পদ্ধতিটি একটি alচ্ছিক কমিট কীওয়ার্ড আর্গুমেন্টকে গ্রহণ করে, যা সত্য বা মিথ্যা উভয়ই গ্রহণ করে। যদি আপনি কমিট = মিথ্যা দিয়ে সেভ () কে কল করেন, তবে এটি এমন কোনও বস্তু ফিরিয়ে দেবে যা এখনও ডাটাবেসে সংরক্ষণ করা হয়নি।

এই ক্ষেত্রে, ফলাফলের মডেলের উদাহরণে সংরক্ষণ () কে কল করা আপনার পক্ষে। আপনি যদি সংরক্ষণ করার আগে অবজেক্টটিতে কাস্টম প্রসেসিং করতে চান বা আপনি যদি বিশেষায়িত কোনও মডেল সংরক্ষণের বিকল্প ব্যবহার করতে চান তবে এটি কার্যকর। কমিট ডিফল্টরূপে সত্য।

দেখে মনে হচ্ছে সেভ (কমিট = ভুয়া) একটি মডেল উদাহরণ তৈরি করে যা এটি আপনার কাছে ফিরে আসে। আসলে কিছু সংরক্ষণের আগে এটি কোনও পোস্ট প্রসেসিংয়ের জন্য ঝরঝরে!


10

"প্রকৃত উদাহরণ" হিসাবে, এমন কোনও ব্যবহারকারী মডেল বিবেচনা করুন যেখানে ইমেল ঠিকানা এবং ব্যবহারকারীর নামটি সর্বদা একই থাকে এবং তারপরে আপনি নিজের মডেলফর্মের সংরক্ষণের পদ্ধতিটি ওভাররাইট করতে পারেন:

class UserForm(forms.ModelForm):
    ...
    def save(self):
        # Sets username to email before saving
        user = super(UserForm, self).save(commit=False)
        user.username = user.email
        user.save()
        return user

আপনি যদি commit=Falseইমেল ঠিকানায় ব্যবহারকারীর নামটি সেট করতে না ব্যবহার করেন তবে আপনাকে ব্যবহারকারী মডেলটির সংরক্ষণ পদ্ধতিটি পরিবর্তন করতে হবে, বা ব্যবহারকারীর বস্তুটি দুটিবার সংরক্ষণ করতে হবে (যা কোনও ব্যয়বহুল ডাটাবেস অপারেশনটিকে নকল করে))


আপনি commit=Falseযদি আপনার ফর্মটি CBVসাথে প্রক্রিয়াকরণ করছেন তবে আপনার কি দরকার def form_valid? আপনি কি শুধু form.instance.[field]আপডেট করতে ব্যবহার করতে পারেন ?
ওরফে ৫১

1
            form = AddAttachmentForm(request.POST, request.FILES)
            if form.is_valid():
                attachment = form.save(commit=False)
                attachment.user = student
                attachment.attacher = self.request.user
                attachment.date_attached = timezone.now()
                attachment.competency = competency
                attachment.filename = request.FILES['attachment'].name
                if attachment.filename.lower().endswith(('.png','jpg','jpeg','.ai','.bmp','.gif','.ico','.psd','.svg','.tiff','.tif')):
                    attachment.file_type = "image"
                if attachment.filename.lower().endswith(('.mp4','.mov','.3g2','.avi','.flv','.h264','.m4v','.mpg','.mpeg','.wmv')):
                    attachment.file_type = "video"
                if attachment.filename.lower().endswith(('.aif','.cda','.mid','.midi','.mp3','.mpa','.ogg','.wav','.wma','.wpl')):
                    attachment.file_type = "audio"
                if attachment.filename.lower().endswith(('.csv','.dif','.ods','.xls','.tsv','.dat','.db','.xml','.xlsx','.xlr')):
                    attachment.file_type = "spreasheet"
                if attachment.filename.lower().endswith(('.doc','.pdf','.rtf','.txt')):
                    attachment.file_type = "text"
                attachment.save()

এখানে সেভ (কমিট = মিথ্যা) ব্যবহারের আমার উদাহরণ is আমি ব্যবহারকারীর ডাটাবেসে সংরক্ষণের আগে কোন ধরণের ফাইল আপলোড করেছি তা যাচাই করতে চেয়েছিলাম। ক্ষেত্রটি ফর্মটিতে না থাকায় এটি সংযুক্ত হওয়ার তারিখটিও পেতে চেয়েছিলাম।


এটি একটি অজগর কোড যা আপনি কোড স্নিপেটে এটি চালাতে পারবেন না
আইয়ুব বানায়েচে

0

সহজ কথায়, আমরা এখানে ফর্ম অবজেক্টটি আপডেট করি এবং তাদের জানতে দিন যে এখনই ডাটাবেসে মানগুলি সংরক্ষণ করবেন না, উদাহরণস্বরূপ আমরা কিছু ইনপুট পরিবর্তন করতে পারি এবং তারপরে ডাটাবেসে সমস্ত মান সংরক্ষণ করতে .save () ব্যবহার করতে পারি।

এটি আমাদের এইচটিএমএল ফর্ম থেকে সমস্ত মান পেতে এবং আমাদের প্রয়োজনীয়তা অনুসারে সেগুলি কাস্টমাইজ করার জন্য নমনীয়তা দেয় এবং তারপরে উদাহরণটি সংরক্ষণ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.