অ্যাডমিনে আমি কোনও ক্ষেত্রটি সংশোধন করার সময় একটি ক্ষেত্রটি অক্ষম করতে চাই, তবে নতুন অবজেক্ট যুক্ত করার সময় এটির প্রয়োজনীয়তা তৈরি করুন।
এই সম্পর্কে যেতে জাঙ্গো উপায় কি?
উত্তর:
আপনি প্রশাসকের get_readonly_fields
পদ্ধতিটিকে ওভাররাইড করতে পারেন :
class MyModelAdmin(admin.ModelAdmin):
def get_readonly_fields(self, request, obj=None):
if obj: # editing an existing object
return self.readonly_fields + ('field1', 'field2')
return self.readonly_fields
আপনি যদি কেবলমাত্র পরিবর্তনের দৃশ্যে সমস্ত ক্ষেত্রকে পঠন হিসাবে সেট করতে চান তবে প্রশাসকের get_readonly_fields ওভাররাইড করুন:
def get_readonly_fields(self, request, obj=None):
if obj: # editing an existing object
# All model fields as read_only
return self.readonly_fields + tuple([item.name for item in obj._meta.fields])
return self.readonly_fields
এবং আপনি যদি পরিবর্তন দেখুনটিতে সেভ বোতামগুলি আড়াল করতে চান :
দর্শন পরিবর্তন করুন
def change_view(self, request, object_id, form_url='', extra_context=None):
''' customize edit form '''
extra_context = extra_context or {}
extra_context['show_save_and_continue'] = False
extra_context['show_save'] = False
extra_context['show_save_and_add_another'] = False # this not works if has_add_permision is True
return super(TransferAdmin, self).change_view(request, object_id, extra_context=extra_context)
ব্যবহারকারী যদি সম্পাদনার চেষ্টা করছেন তবে অনুমতিগুলি পরিবর্তন করুন:
def has_add_permission(self, request, obj=None):
# Not too much elegant but works to hide show_save_and_add_another button
if '/change/' in str(request):
return False
return True
এই সমাধানটি জাঙ্গো ১.১১ এর উপরে পরীক্ষা করা হয়েছে
এফওয়াইআই: যদি দু'জন একই সমস্যার মুখোমুখি হয় তবে:
আপনার এখনও ক্লাসের শরীরে স্থায়ীভাবে পঠনযোগ্য_ফিল্ডগুলি ঘোষণা করা উচিত, যেহেতু পঠন_ফিল্ড শ্রেণীর বৈশিষ্ট্যটি বৈধতা থেকে অ্যাক্সেস করা হবে (দেখুন django.contrib.admin. માન્યকরণ: বৈধতা_বাস) (লাইন .২13১৩ অ্যাপেক্স)
Get_readonly_fields () এর পিতা-মাতা আপত্তি হওয়ায় এটি ইনলাইনগুলির সাথে কাজ করবে না (আমার কাছে সিএসএস বা জেএস ব্যবহার করে দুটি হ্যাকি এবং কম সুরক্ষা সমাধান রয়েছে)
বার্নহার্ড ভাল্যান্টের পূর্ববর্তী দুর্দান্ত পরামর্শের উপর ভিত্তি করে একটি প্রকরণ, যা বেস বর্গ দ্বারা সরবরাহিত কোনও সম্ভাব্য কাস্টমাইজেশন (যদি থাকে) সংরক্ষণ করে:
class MyModelAdmin(BaseModelAdmin):
def get_readonly_fields(self, request, obj=None):
readonly_fields = super(MyModelAdmin, self).get_readonly_fields(request, obj)
if obj: # editing an existing object
return readonly_fields + ['field1', ..]
return readonly_fields
জ্যাঙ্গো ২.২.x এর জন্য ইনলাইন ফর্মগুলির পরিস্থিতি এখনও স্থির করা হয়নি তবে জন থেকে সমাধান আসলে বেশ স্মার্ট।
কোডটি আমার পরিস্থিতির সাথে সামান্য সামঞ্জস্যপূর্ণ:
class NoteListInline(admin.TabularInline):
""" Notes list, readonly """
model = Note
verbose_name = _('Note')
verbose_name_plural = _('Notes')
extra = 0
fields = ('note', 'created_at')
readonly_fields = ('note', 'created_at')
def has_add_permission(self, request, obj=None):
""" Only add notes through AddInline """
return False
class NoteAddInline(admin.StackedInline):
""" Notes edit field """
model = Note
verbose_name = _('Note')
verbose_name_plural = _('Notes')
extra = 1
fields = ('note',)
can_delete = False
def get_queryset(self, request):
queryset = super().get_queryset(request)
return queryset.none() # no existing records will appear
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
# ...
inlines = (NoteListInline, NoteAddInline)
# ...
আপনি মডেলএডমিনের ফর্মফিল্ড_ফর্ম_ফরইগনকি পদ্ধতিটি ওভাররাইড করে এটি করতে পারেন:
from django import forms
from django.contrib import admin
from yourproject.yourapp.models import YourModel
class YourModelAdmin(admin.ModelAdmin):
class Meta:
model = YourModel
def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
# Name of your field here
if db_field.name == 'add_only':
if request:
add_opts = (self._meta.app_label, self._meta.module_name)
add = u'/admin/%s/%s/add/' % add_opts
if request.META['PATH_INFO'] == add:
field = db_field.formfield(**kwargs)
else:
kwargs['widget'] = forms.HiddenInput()
field = db_field.formfield(**kwargs)
return field
return admin.ModelAdmin(self, db_field, request, **kwargs)
একই সমস্যা পেয়েছি। মডেলএডমিনে আমি "অ্যাড_ফিল্ডসেটস" এবং "সীমাবদ্ধ_ফিল্ডসেটস" দিয়ে এটি সমাধান করেছি।
from django.contrib import admin
class MyAdmin(admin.ModelAdmin):
declared_fieldsets = None
restricted_fieldsets = (
(None, {'fields': ('mod_obj1', 'mod_obj2')}),
( 'Text', {'fields': ('mod_obj3', 'mod_obj4',)}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('add_obj1', 'add_obj2', )}),
)
দয়া করে দেখুন: http://code.djangoproject.com/svn/django/trunk/django/contrib/auth/admin.py
তবে এটি "add_objX" এর পরবর্তী পরিবর্তনগুলি থেকে আপনার মডেলটিকে সুরক্ষা দেয় না। আপনি যদি এটিও চান তবে আমার মনে হয় আপনাকে মডেল ক্লাসটি "সংরক্ষণ" ফাংশনটি দিয়ে যেতে হবে এবং সেখানে পরিবর্তনগুলি পরীক্ষা করতে হবে।
দেখুন: www.djangoproject.com/docamentation/models/save_delete_hooks/
গ্রিজ, নিক