জ্যাঞ্জো অ্যাডমিন কেবলমাত্র প্রবৃত্তি সংশোধন করার সময় একটি ক্ষেত্রকে পঠনযোগ্য করে তোলে তবে নতুন আপত্তি যুক্ত করার সময় প্রয়োজনীয়


91

অ্যাডমিনে আমি কোনও ক্ষেত্রটি সংশোধন করার সময় একটি ক্ষেত্রটি অক্ষম করতে চাই, তবে নতুন অবজেক্ট যুক্ত করার সময় এটির প্রয়োজনীয়তা তৈরি করুন।

এই সম্পর্কে যেতে জাঙ্গো উপায় কি?

উত্তর:


178

আপনি প্রশাসকের 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

21
গৌণ / বড় সাবধানবাণী: এটি ইনলাইনগুলির পক্ষে কাজ করে না। গতিশীল "অন্য এক্স যুক্ত করুন" বোতামটি কেবলমাত্র প্রত্যাশিত ক্ষেত্রকে "(কিছুই নয়)" হিসাবে দেখায়, কোনও ফর্ম ক্ষেত্র নয় যা আপনি প্রত্যাশা করেন।
সেরিন

17

আপনি যদি কেবলমাত্র পরিবর্তনের দৃশ্যে সমস্ত ক্ষেত্রকে পঠন হিসাবে সেট করতে চান তবে প্রশাসকের 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

এবং আপনি যদি পরিবর্তন দেখুনটিতে সেভ বোতামগুলি আড়াল করতে চান :

  1. দর্শন পরিবর্তন করুন

    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)
    
  2. ব্যবহারকারী যদি সম্পাদনার চেষ্টা করছেন তবে অনুমতিগুলি পরিবর্তন করুন:

    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
    

    এই সমাধানটি জাঙ্গো ১.১১ এর উপরে পরীক্ষা করা হয়েছে


পারফেক্ট এটাই আমার দরকার ছিল!
wogsland

3

এফওয়াইআই: যদি দু'জন একই সমস্যার মুখোমুখি হয় তবে:

  1. আপনার এখনও ক্লাসের শরীরে স্থায়ীভাবে পঠনযোগ্য_ফিল্ডগুলি ঘোষণা করা উচিত, যেহেতু পঠন_ফিল্ড শ্রেণীর বৈশিষ্ট্যটি বৈধতা থেকে অ্যাক্সেস করা হবে (দেখুন django.contrib.admin. માન્યকরণ: বৈধতা_বাস) (লাইন .২13১৩ অ্যাপেক্স)

  2. Get_readonly_fields () এর পিতা-মাতা আপত্তি হওয়ায় এটি ইনলাইনগুলির সাথে কাজ করবে না (আমার কাছে সিএসএস বা জেএস ব্যবহার করে দুটি হ্যাকি এবং কম সুরক্ষা সমাধান রয়েছে)


4
২. বিন্দু - এটি অ্যাডমিনের একটি বাগের কারণে: # 15602 দেখে মনে হচ্ছে এটি শীঘ্রই স্থির করা হবে না (শেষ ক্রিয়াকলাপ 2 বছর আগে), সুতরাং দেখে মনে হচ্ছে আমরা সিএসএস / জেএস সমাধানে রেখে এসেছি।
frnhr

2

বার্নহার্ড ভাল্যান্টের পূর্ববর্তী দুর্দান্ত পরামর্শের উপর ভিত্তি করে একটি প্রকরণ, যা বেস বর্গ দ্বারা সরবরাহিত কোনও সম্ভাব্য কাস্টমাইজেশন (যদি থাকে) সংরক্ষণ করে:

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

2

জ্যাঙ্গো ২.২.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)
    # ...

0

আপনি মডেলএডমিনের ফর্মফিল্ড_ফর্ম_ফরইগনকি পদ্ধতিটি ওভাররাইড করে এটি করতে পারেন:

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)

0

একই সমস্যা পেয়েছি। মডেলএডমিনে আমি "অ্যাড_ফিল্ডসেটস" এবং "সীমাবদ্ধ_ফিল্ডসেটস" দিয়ে এটি সমাধান করেছি।

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/

গ্রিজ, নিক

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