আমি একটি ফর্মের পরিষ্কার পদ্ধতিটির জন্য অনুরোধ.ইউসারটির চেষ্টা করছি, তবে আমি কীভাবে অনুরোধের অবজেক্টটি অ্যাক্সেস করতে পারি? ভেরিয়েবল ইনপুটটিকে অনুমতি দেওয়ার জন্য কি আমি পরিষ্কার পদ্ধতিটি পরিবর্তন করতে পারি?
উত্তর:
থ্রিডোকলসে স্টোর করা - বারের উত্তরটি খুব খারাপ ধারণা। এইভাবে এটি করার কোনও কারণ নেই।
__init__অতিরিক্ত কিওয়ার্ড আর্গুমেন্ট গ্রহণের জন্য ফর্মের পদ্ধতিটিকে ওভাররাইড করা একটি আরও ভাল উপায় request। এটি অনুরোধটি ফর্মটিতে সঞ্চয় করে , যেখানে এটি প্রয়োজন হয় এবং কোথা থেকে আপনি আপনার পরিষ্কার পদ্ধতিতে এটি অ্যাক্সেস করতে পারেন।
class MyForm(forms.Form):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super(MyForm, self).__init__(*args, **kwargs)
def clean(self):
... access the request object via self.request ...
এবং আপনার দৃষ্টিতে:
myform = MyForm(request.POST, request=request)
আপডেট 10/25/2011 : আমি এখন পদ্ধতির পরিবর্তে গতিশীলভাবে তৈরি ক্লাসের সাথে এটি ব্যবহার করছি, কারণ জ্যাঙ্গো ১.৩ অন্যথায় কিছুটা অদ্ভুততা প্রদর্শন করে।
class MyModelAdmin(admin.ModelAdmin):
form = MyCustomForm
def get_form(self, request, obj=None, **kwargs):
ModelForm = super(MyModelAdmin, self).get_form(request, obj, **kwargs)
class ModelFormWithRequest(ModelForm):
def __new__(cls, *args, **kwargs):
kwargs['request'] = request
return ModelForm(*args, **kwargs)
return ModelFormWithRequest
তারপরে MyCustomForm.__init__নিম্নরূপে ওভাররাইড করুন :
class MyCustomForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super(MyCustomForm, self).__init__(*args, **kwargs)
এর পরে আপনি কোন পদ্ধতি থেকে অনুরোধ বস্তুর অ্যাক্সেস করতে পারেন ModelFormসঙ্গে self.request।
__new__'ক্লার্গ্স'কে অনুরোধ যোগ করেছেন যা পরে শ্রেণীর __init__পদ্ধতিতে পাস করা হবে । ক্লাসের নামকরণের চেয়ে ModelFormWithRequestআমি এর থেকে অর্থ আরও স্পষ্ট মনে করি ModelFormMetaClass।
এটি মূল্যবান কিসের জন্য, যদি আপনি ফাংশন ভিত্তিক ভিউগুলির পরিবর্তে শ্রেণিভিত্তিক দর্শনগুলি ব্যবহার get_form_kwargsকরেন তবে আপনার সম্পাদনা দৃশ্যে ওভাররাইড করুন । একটি কাস্টম ক্রিয়েভ ভিউয়ের উদাহরণ কোড :
from braces.views import LoginRequiredMixin
class MyModelCreateView(LoginRequiredMixin, CreateView):
template_name = 'example/create.html'
model = MyModel
form_class = MyModelForm
success_message = "%(my_object)s added to your site."
def get_form_kwargs(self):
kw = super(MyModelCreateView, self).get_form_kwargs()
kw['request'] = self.request # the trick!
return kw
def form_valid(self):
# do something
উপরের ভিউ কোডটি requestফর্মটির __init__নির্মাণকারীর কার্যত কীওয়ার্ড আর্গুমেন্টগুলির মধ্যে একটি হিসাবে উপলব্ধ করবে । সুতরাং আপনার ModelFormকাজ:
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
def __init__(self, *args, **kwargs):
# important to "pop" added kwarg before call to parent's constructor
self.request = kwargs.pop('request')
super(MyModelForm, self).__init__(*args, **kwargs)
requestমধ্যে বস্তুটি রাখে cater get_form_kwargs
self.get_object? CreateViewপ্রসারিত SingleObjectMixin। তবে এটি কার্যকর হয় বা একটি ব্যতিক্রম উত্থাপন করে কিনা আপনি কোনও নতুন অবজেক্ট তৈরি করছেন বা বিদ্যমানটিকে আপডেট করছেন কিনা তার উপর নির্ভর করে; যেমন উভয় ক্ষেত্রে পরীক্ষা (এবং অবশ্যই মুছে ফেলা)।
সাধারণ অ্যাপ্রোচ হ'ল একটি মিডওয়্যার ব্যবহার করে অনুরোধ অবজেক্টটি থ্রেড-লোকাল রেফারেন্সে সঞ্চয় করা। তারপরে আপনি form.clean () পদ্ধতি সহ আপনার অ্যাপের যে কোনও জায়গা থেকে এটিকে অ্যাক্সেস করতে পারবেন can
ফর্ম.ক্লিয়েন () পদ্ধতির স্বাক্ষর পরিবর্তন করার অর্থ আপনার নিজের জ্যাঙ্গোর পরিবর্তিত সংস্করণ রয়েছে যা আপনি যা চান তা নাও হতে পারে।
মিডলওয়্যার গণনা ধন্যবাদ এই মত দেখতে কিছু:
import threading
_thread_locals = threading.local()
def get_current_request():
return getattr(_thread_locals, 'request', None)
class ThreadLocals(object):
"""
Middleware that gets various objects from the
request object and saves them in thread local storage.
"""
def process_request(self, request):
_thread_locals.request = request
জ্যাঙ্গো ডক্সে বর্ণিত এই মিডওয়্যারটিকে নিবন্ধভুক্ত করুন
**kwargs, যার অর্থ আপনাকে অনুরোধের অবজেক্টটি পাস করতে হবে MyForm(request.POST, request=request)।
জাজানো অ্যাডমিনের জন্য, জ্যাঙ্গো ১.৮ এ
class MyModelAdmin(admin.ModelAdmin):
...
form = RedirectForm
def get_form(self, request, obj=None, **kwargs):
form = super(MyModelAdmin, self).get_form(request, obj=obj, **kwargs)
form.request = request
return form
অ্যাডমিনটি কাস্টমাইজ করার সময় আমি এই বিশেষ সমস্যায় পড়েছিলাম। আমি নির্দিষ্ট অ্যাডমিনের শংসাপত্রগুলির ভিত্তিতে একটি নির্দিষ্ট ক্ষেত্রটি বৈধ হওয়ার জন্য চেয়েছিলাম।
যেহেতু আমি অনুরোধটি ফর্মটির পক্ষে যুক্ত করার জন্য দৃষ্টিভঙ্গিটি পরিবর্তন করতে চাইনি, তাই আমি যা করেছি তা নিম্নলিখিত:
class MyCustomForm(forms.ModelForm):
class Meta:
model = MyModel
def clean(self):
# make use of self.request here
class MyModelAdmin(admin.ModelAdmin):
form = MyCustomForm
def get_form(self, request, obj=None, **kwargs):
ModelForm = super(MyModelAdmin, self).get_form(request, obj=obj, **kwargs)
def form_wrapper(*args, **kwargs):
a = ModelForm(*args, **kwargs)
a.request = request
return a
return form_wrapper
obj=objনা obj=Noneলাইন 11.
'function' object has no attribute 'base_fields'। তবে, সরল (বন্ধ না করে) @ ফরাসোয়াস উত্তরটি সহজেই কাজ করে।
আপনি সর্বদা এই পদ্ধতিটি ব্যবহার করতে পারবেন না (এবং এটির সম্ভবত খারাপ অভ্যাস), তবে আপনি যদি কেবলমাত্র একটি ফর্মটিতে ফর্মটি ব্যবহার করেন তবে আপনি এটিকে ভিউ পদ্ধতির মধ্যেই সুযোগ দিতে পারেন।
def my_view(request):
class ResetForm(forms.Form):
password = forms.CharField(required=True, widget=forms.PasswordInput())
def clean_password(self):
data = self.cleaned_data['password']
if not request.user.check_password(data):
raise forms.ValidationError("The password entered does not match your account password.")
return data
if request.method == 'POST':
form = ResetForm(request.POST, request.FILES)
if form.is_valid():
return HttpResponseRedirect("/")
else:
form = ResetForm()
return render_to_response(request, "reset.html")
get_form_classপদ্ধতিতে করি, যদি আমি জানি তবে আমার অনুরোধটি সহ প্রচুর স্টাফ করা দরকার। বারবার ক্লাস তৈরির ক্ষেত্রে কিছু ওভারহেড থাকতে পারে তবে এটি কেবল আমদানির সময় থেকে রান-টাইমে স্থানান্তরিত করে।
ড্যানিয়েল রোজম্যানের উত্তর এখনও সেরা। তবে আমি কয়েকটি কারণে কীওয়ার্ড আর্গুমেন্টের পরিবর্তে অনুরোধের জন্য প্রথম অবস্থানিক যুক্তিটি ব্যবহার করব:
শেষ অবধি, বিদ্যমান বিদ্যমান ভেরিয়েবলকে ওভাররাইড না করার জন্য আমি আরও একটি অনন্য নাম ব্যবহার করব। সুতরাং, আমার পরিবর্তিত উত্তরটি দেখে মনে হচ্ছে:
class MyForm(forms.Form):
def __init__(self, request, *args, **kwargs):
self._my_request = request
super(MyForm, self).__init__(*args, **kwargs)
def clean(self):
... access the request object via self._my_request ...
পিজারবেকার @ পিপিআই থেকে তাজা পনির: জাজানো-রিকোয়েস্টপ্রাইডার
আপনার প্রয়োজন অনুসারে এই প্রশ্নের উত্তর আমার কাছে আছে যা আপনি ফর্মের পরিষ্কার পদ্ধতিতে ব্যবহারকারীকে অ্যাক্সেস করতে চান। আপনি এটি চেষ্টা করতে পারেন। View.py
person=User.objects.get(id=person_id)
form=MyForm(request.POST,instance=person)
form.py
def __init__(self,*arg,**kwargs):
self.instance=kwargs.get('instance',None)
if kwargs['instance'] is not None:
del kwargs['instance']
super(Myform, self).__init__(*args, **kwargs)
এখন আপনি form.py এ যে কোনও পরিষ্কার পদ্ধতিতে সেলফিনস্ট্যান্স অ্যাক্সেস করতে পারবেন
আপনি যখন "প্রস্তুত" জ্যাঙ্গো শ্রেণীর দর্শনগুলির মাধ্যমে এটি অ্যাক্সেস করতে চান তখন CreateViewজানার মতো একটি ছোট কৌশল আছে (= অফিশিয়াল সমাধান বাক্সটি কার্যকর করে না)। আপনার নিজের মধ্যে CreateView আপনাকে এই জাতীয় কোড যুক্ত করতে হবে:
class MyCreateView(LoginRequiredMixin, CreateView):
form_class = MyOwnForm
template_name = 'my_sample_create.html'
def get_form_kwargs(self):
result = super().get_form_kwargs()
result['request'] = self.request
return result
= সংক্ষেপে এটি হ'ল requestজ্যাঙ্গোর তৈরি / আপডেট দেখুন সহ আপনার ফর্মটিতে যাওয়ার সমাধান ।