একটি ফর্ম আরম্ভের পরে জাজানো সেট ক্ষেত্রের মান


116

আমি ফর্মটি শুরু করার পরে ক্ষেত্রটিকে একটি নির্দিষ্ট মান হিসাবে সেট করার চেষ্টা করছি।

উদাহরণস্বরূপ, আমার নিম্নলিখিত ক্লাস রয়েছে।

class CustomForm(forms.Form):
    Email = forms.EmailField(min_length=1, max_length=200)

দৃষ্টিতে, আমি এই জাতীয় কিছু করতে সক্ষম হতে চাই:

form = CustomForm()
form["Email"] = GetEmailString()

return HttpResponse(t.render(c))

উত্তর:


135

যেহেতু আপনি পোস্টের ডেটাতে পাস করছেন না, তাই আমি ধরে নেব যে আপনি যা করার চেষ্টা করছেন তা প্রাথমিক মান সেট করে যা ফর্মটিতে প্রদর্শিত হবে। আপনি যেভাবে এটি করছেন সেটি initialকীওয়ার্ড সহ।

form = CustomForm(initial={'Email': GetEmailString()})

দেখুন জ্যাঙ্গো ফরম ডক্স আরো ব্যাখ্যার জন্য।

আপনি যদি ফর্মটি জমা দেওয়ার পরে কোনও মান পরিবর্তন করার চেষ্টা করছেন, আপনি এমন কিছু ব্যবহার করতে পারেন:

if form.is_valid():
    form.cleaned_data['Email'] = GetEmailString()

আরও ব্যবহারের জন্য উপরের রেফারেন্সড ডক্সটি পরীক্ষা করুন cleaned_data


2
এটি আমি যা জানতাম তা নিশ্চিত করে, তবে আমি ModelChoiceFieldএখনও এটির একটি initialমূল্য দিলে আমার
অবৈধ

হ্যাঁ, এটিও আমার সমস্যা। এবং form.data ['ইমেল'] পরিবর্তন করা সম্ভব নয়।
জারজিলি পোলোনকাই

2
আমি আমার পরিবর্তন করেছি form.data['Email'] = GetEmailString()এবং এটি কাজ করে
psychok7

1
আমার এটিকে কাস্টমফর্ম (অনুরোধ.পোস্ট) এবং .is_ માન્ય () এর মধ্যে সেট করা দরকার , তাই আমি কনস্ট্রাক্টরের মধ্যে আর না কোনও ক্লিন_ডেটা ব্যবহার করতে পারি না। আমি form.data ব্যবহার করার চেষ্টা করেছি, তবে এটি পরিবর্তনযোগ্য নয় (জাজানো 1.1)।
টেকিন

এই প্রশ্নের সঠিক সমাধান, হওয়া উচিত: হওয়ার পরও আপনি আপনার ফর্ম instanciated থাকার আপনার মান আরম্ভ করতে অ্যাক্সেস দেয়form.fields['Email'].initial = GetEmailString()form.fields['keyword'].initial
vctrd

95

আপনি যদি ইতিমধ্যে ফর্মটি আরম্ভ করেছেন তবে আপনি ক্ষেত্রের প্রাথমিক সম্পত্তিটি ব্যবহার করতে পারেন। উদাহরণ স্বরূপ,

form = CustomForm()
form.fields["Email"].initial = GetEmailString()

ফর্মসেটের সাথে লুপের ক্ষেত্রেও দুর্দান্ত কাজ করে, কেবল "ফর্মেটে ফর্মের জন্য" যুক্তিটি ব্যবহার করুন এবং আপনি উপরের মত পছন্দ এবং প্রাথমিক ডেটা সেট করতে পারেন।
র‌্যাডটেক

5
এটি করার আলাদা উপায় কি জ্যাঙ্গো 1.7 / পাইথন 3.4? এটি আমার পক্ষে কাজ করছে না
জেরেমি

1
@ জেরেমি ক্রেইগমার্টিনেজ: না ... আপনি যে ফর্মটি বাউন্ড ফর্ম চেষ্টা করছেন তা কি (জিইটি / পোষ্টের ডেটা দিয়ে গেছে)? দস্তাবেজগুলি বলে যে প্রাথমিক মানগুলি কেবল আনবাউন্ড ফর্মগুলির জন্য প্রদর্শিত হয়। আবদ্ধ ফর্মগুলির জন্য, এইচটিএমএল আউটপুট বাউন্ড ডেটা ব্যবহার করবে। , এখানে দেখুন
মার্কাস

9
সঠিক উপায় হ'ল form.initial ["ইমেল"] = গেটইমেলস্ট্রিং ()
এলিও স্কর্ডো

12

আপনি যদি __init__কোনও কারণে ফর্মের পদ্ধতির মধ্যে এটি করতে চান তবে আপনি initialডিকটি পরিচালনা করতে পারেন :

class MyForm(forms.Form):
    my_field = forms.CharField(max_length=255)

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.initial['my_field'] = 'Initial value'

অবশেষে সমাধানটি সন্ধান করলেন। ধন্যবাদ. এটা আমার জন্য কাজ।
Almas Dusal

8

আপনি যদি ফর্ম ডেটা সংগ্রহের সেটটির অনুলিপিটিতে ডেটা যুক্ত করে থাকেন তবে নাইজেল কোহেনের মতো কিছু কাজ করবে :

form = FormType(request.POST)
if request.method == "POST":
    formcopy = form(request.POST.copy())
    formcopy.data['Email'] = GetEmailString()

1
আমি কাঁচা ডেটা ওভাররাইড করার কোনও বড় অনুরাগী নই। আপনার যদি একেবারে এটি করতে হয় তবে আপনার সম্ভবত সম্ভবত data[form.add_prefix('Email')]এমন একটি ক্ষেত্রে অ্যাকাউন্ট করতে হবে যেখানে একটি উপসর্গ সেট করা আছে।
জোশ

2
এটি করার আলাদা উপায় কি জ্যাঙ্গো 1.7 / পাইথন 3.4? এটি আমার পক্ষে কাজ করছে না
জেরেমি

আসল ফর্মটি রাখার দরকার না থাকলে ২ য় লাইনটি কিছুটা ছোট হতে পারে:form.data = form.data.copy()
ZZY

@ জোশ, এখানে প্রয়োজনীয়তার একটি দৃশ্য রয়েছে: ইনপুট -> ইনপুট দিয়ে প্রক্রিয়াজাতকরণ -> প্রক্রিয়াজাতকরণ -> ফর্মের বেশ কয়েকটি ক্ষেত্র মুছুন / সংশোধন করুন এবং প্রতিক্রিয়া হিসাবে এইচটিএমএলকে রেন্ডার করুন form উদাহরণস্বরূপ, কোনও ফর্মের 'নাম', 'ইমেল', 'সামগ্রী' ক্ষেত্র রয়েছে, আমি 'নাম' এবং 'ইমেল' রাখতে চাই, তবে 'সামগ্রী' মুছতে চাই। যাতে ব্যবহারকারীরা আর কোনও পিওএসটি জমা দিতে চান, তবে নাম / ইমেলটি পুনরায় ইনপুট করতে হবে না। অবশ্যই প্রাথমিক নামটি একটি উপায় হিসাবে একই নাম / ইমেলের সাথে একটি নতুন ফর্মের সূচনা করুন তবে আমি মনে করি যে পুরানো ফর্মটি মুছে ফেলা কিছু ক্ষেত্রে সহজ
ZZY

আমি নিশ্চিত না যে আমি পুরোপুরি বুঝতে পেরেছি। যাইহোক, আমি যদি করি তবে এটি আমার কাছে মনে হচ্ছে আপনার পরিবর্তে ব্যবহার করা উচিত modelform_factory। আপনি চান না এমন ক্ষেত্রগুলি নেই এমন আপনি একটি ফর্ম শ্রেণি তৈরি করতে পারেন। এমন ফর্ম শ্রেণি থাকা খুব বিপজ্জনক যে ক্ষেত্রগুলি যেগুলি রেন্ডার করে না ফর্ম অবজেক্টটি এখনও রেন্ডারহীন ক্ষেত্রগুলির জন্য ডেটা গ্রহণ করবে। একজন আক্রমণকারী তাদের সুবিধার জন্য এটি ব্যবহার করতে পারে।
জোশ

5

আপনি যদি ফর্মটি এভাবে শুরু করেন

form = CustomForm()

তারপরে জানুয়ারী 2019 এর সঠিক উপায়টি হ'ল .initialডেটা প্রতিস্থাপনের জন্য ব্যবহার করা। এটি intialফর্মের সাথে ডিকের ডেটা প্রতিস্থাপন করবে । আপনি যদি কিছু উদাহরণ ব্যবহার করে আরম্ভ করে থাকেন তবে এটিও কাজ করে form = CustomForm(instance=instance)

ফর্মটিতে ডেটা প্রতিস্থাপন করতে আপনার প্রয়োজন

form.initial['Email'] = GetEmailString()

এটি সাধারণ করা এটি হবে,

form.initial['field_name'] = new_value

3

কেবলমাত্র আপনার ফর্ম.ডাটা ক্ষেত্রটি পরিবর্তন করুন:

class ChooseProjectForm(forms.Form):
    project = forms.ModelChoiceField(queryset=project_qs)
    my_projects = forms.BooleanField()

    def __init__(self, *args, **kwargs):
        super(ChooseProjectForm, self).__init__(*args, **kwargs)
        self.data = self.data.copy()  # IMPORTANT, self.data is immutable
        # any condition:
        if self.data.get('my_projects'):
            my_projects = self.fields['project'].queryset.filter(my=True)
            self.fields['project'].queryset = my_projects
            self.fields['project'].initial = my_projects.first().pk
            self.fields['project'].empty_label = None  # disable "-----"
            self.data.update(project=my_projects.first().pk)  # Update Form data
            self.fields['project'].widget = forms.HiddenInput()  # Hide if you want

0

মিশ্রণটিতে আরও একটি উপায় ছুঁড়ে ফেলার জন্য: এটি আরও কিছুটা আধুনিক স্বরলিপি সহ কার্যকর হয়। এটি কেবল QueryDictস্থায়ী যে সত্যের চারপাশে কাজ করে ।

>>> the_form.data = {**f.data.dict(), 'some_field': 47}
>>> the_form['some_field'].as_widget()
'<input type="hidden" name="some_field" value="47"
        class="field-some_field" id="id_some_field">'

0

উইজেটে 'মান' অ্যাটর ব্যবহার করুন। উদাহরণ:

username = forms.CharField(
    required=False,
    widget=forms.TextInput(attrs={'readonly': True, 'value': 'CONSTANT_VALUE'}),
)

-12

এটি করার আরেকটি উপায়, যদি আপনি ইতিমধ্যে কোনও ফর্ম (ডেটা সহ বা ছাড়াই) সূচনা করে থাকেন, এবং এটি প্রদর্শন করার আগে আপনাকে আরও ডেটা যুক্ত করতে হবে:

form = Form(request.POST.form)
form.data['Email'] = GetEmailString()

8
এটি আমার জন্য ব্যর্থ। আমি আমার ফর্ম এর উপরে মত একটি লাইন আছে Init পদ্ধতি, এবং এটি উত্থাপন "AttributeError এই QueryDict উদাহরণস্বরূপ অপরিবর্তনীয় হয়"
জনাথন হার্টলি

এই কোডটি তখনই কাজ করে যখন কোনও ফর্ম ডেটা ছাড়াই ফর্মটি আরম্ভ করা হয়েছিল। ফলস্বরূপ, অনুরোধের মতো একটি অপরিবর্তনীয় অবজেক্ট.জিইটি বা অনুরোধ।পোস্ট আবদ্ধ হবে না, সুতরাং আপনি একটি খালি অভিধান (ফর্ম.ডাটা) পাবেন যা কোনও ত্রুটি ছাড়াই পরিবর্তন করা যায়। এফওয়াইআই আমি জ্যাঙ্গো 1.6.3 ব্যবহার করছি
পটার

আপনার "সামগ্রী-প্রকার" শিরোনামটি "মাল্টিপার্ট / ফর্ম-ডেটা" তে সেট করা থাকলে এটি কাজ করবে। এটি ব্যর্থ হয় যখন আপনি "অ্যাপ্লিকেশন / x-www-form-urlencoded" একটি সামগ্রী ধরণের ব্যবহার করেন। কেন জানি না, তবে এটি ডিবাগ করা ছিল *****।
টিউউয়েন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.