Barcha model faqat o'qiladi

Django administratorida faqat o'qish modelini yaratishning bir usuli bormi? ammo butun modelni nazarda tutyapman. Shunday qilib, hech narsa qo'shilmaydi, yo'qolmaydi, o'zgarmaydi, faqat moslamalarni va maydonlarni ko'rasiz, hamma narsa faqat o'qish uchunmi?

13
Davom etilayotgan ish shunday: github.com/django/django/pull/5297
qo'shib qo'ydi muallif Bosco, manba

5 javoblar

ModelAdmin kubaga get_readonly_fields() ni taqdim etadi - quyidagi testdan o'tmagan, mening fikrimcha, ModelAdmin uni barcha joylarni o'z-o'zidan o'qiladigan joylar bilan o'zlashtirmasdan belgilashda aniqlash:

from django.contrib.admin.util import flatten_fieldsets

class ReadOnlyAdmin(ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        if self.declared_fieldsets:
            fields = flatten_fieldsets(self.declared_fieldsets)
        else:
            form = self.get_formset(request, obj).form
            fields = form.base_fields.keys()
        return fields

u holda ushbu administratorni faqat o'qiladi ma'mur bo'lishi kerak bo'lgan subclass/mixin.

Qo'shish/o'chirish va tugmalarini yo'q qilish uchun, ehtimol siz ham qo'shishni xohlaysiz

    def has_add_permission(self, request):
        # Nobody is allowed to add
        return False
    def has_delete_permission(self, request, obj=None):
        # Nobody is allowed to delete
        return False

P.S .: ModelAdmin'da, has_change_permission (qidirish yoki bekor qilish) Soxta bo'lsa, siz ob'ektni o'zgartirish ko'rinishida qolmaysiz va unga havola ko'rsatilmaydi. Aslida bu juda yaxshi bo'lardi va standart get_readonly_fields() o'zgarish ruxsatini tekshirib chiqdi va barcha joylarni yuqoridagi kabi o'qiladi. Shunday qilib, o'zgartiruvchilar hech bo'lmaganda ma'lumotlarni ko'rib chiqishlari mumkin ... agar mavjud boshqaruv tuzilmasi jateanizm ta'kidlaganidek, view = edit deb hisoblasa, bu ehtimol "qo'shish/o'zgartirish/o'chirish" ...

E'TIRONING: barcha maydonlar o'qilishi mumkin, ammo tekshirilmagan, ammo istiqbolli ko'rinishga ega:

readonly_fields = MyModel._meta.get_all_field_names()

EDIT: Yana bir narsa

if self.declared_fieldsets:
    return flatten_fieldsets(self.declared_fieldsets)
else:
    return list(set(
        [field.name for field in self.opts.local_fields] +
        [field.name for field in self.opts.local_many_to_many]
    ))
11
qo'shib qo'ydi
PS: Endi ushbu xususiyat uchun xususiyat so'rovini yaratdim. code.djangoproject.com/ticket/17295
qo'shib qo'ydi muallif Danny W. Adair, manba
Eslatma: get_formset usuli faqat InlineModelAdmin uchun belgilanadi
qo'shib qo'ydi muallif Vajk Hermecz, manba
Salom, ushbu variantlar uchun rahmat. Men sizlarning barchangiz emasligini ko'rib turganingizdek, sizning parcha-parchaingiz bo'lgan javoblarga aloqador bo'lishi uchun muloyim bo'lishi mumkin. Yana bir ustunlik, o'quvchilar har bir taklif ustida boshqalarning fikrlarini ham ko'ra olishi mumkin edi.
qo'shib qo'ydi muallif steps, manba
Django 1.11 da ishlamaydi - AttributeError: 'ReadOnlyAdmin' obyekti 'declared_fieldsets' xususiyati yo'q
qo'shib qo'ydi muallif turbotux, manba

"Ko'rish uchun ruxsatnomalar" sifatida Django 1.11 ga yozib bo'lmaydi », afsuski, , ModelAdmin faqat o'qish uchun model modelini o'zgartiradi va model tarixini jurnalga kiritishni no-op qo'shib qo'yadigan echim.

def false(*args, **kwargs):
    """A simple no-op function to make our changes below readable."""
    return False

class MyModelReadOnlyAdmin(admin.ModelAdmin):
    list_display = [
        # list your admin listview entries here (as usual) 
    ]
    readonly_fields = [
        # list your read-only fields here (as usual)
    ]

    actions = None
    has_add_permission = false
    has_delete_permission = false
    log_change = false
    message_user = false
    save_model = false

( QAYD: FALSE no-op yordamchisini False yordamida tuzatmang. sinf uni sinfga ko'chiradi, no_op yoki boshqa biror narsa deb nomlang yoki ta'sirlangan atributlarni odatiy def lar bilan bekor qilinsin. ..)

Bu shunday bo'ladi:

  1. ro'yxat ko'rinishida "ochish" qutisini ("o'chirish") o'chirish
  2. yangi modellar kiritishni taqiqlash
  3. Mavjud model yozuvlarini o'chirishga ruxsat berish
  4. model tarixida kundalik yozuvlarni yaratishdan qoching
  5. saqlashdan keyin "muvaffaqiyatli o'zgartirilgan" xabarlarni ko'rishdan qoching
  6. ma'lumotlar bazasiga o'zgartirish formatidagi o'zgarishlarni saqlab qo'ying.

Bu shunday emas:

  • "Saqlash va tahrirni davom eting" va "SAVE" (foydalanuvchi tajribasini yaxshilash yaxshi bo'lar edi) ikki tugmachani olib tashlang yoki o'zgartiring

Eslatma: get_all_field_names (qabul qilingan javobda aytilganidek)

Django 1.10da o'chirilgan . Django 1.10.5 bilan testlangan.

3
qo'shib qo'ydi

Siz ModelAdmin sinflarni readonly_fields xususiyati. Ko'proq ma'lumot olish uchun ushbu javob bo'limiga qarang.

2
qo'shib qo'ydi
U erda, lekin oson emas. Siz Django-dagi maxsus ruxsatnomalarni yaratishga qodirsiz, lekin administrator saytiga kelganda u noyobdir. Django, agar foydalanuvchilar kontentni administrator interfeysida ko'rishga ruxsat berilsa, ularni tahrir qilish huquqiga ham ega. Siz taklifingizni bu savolni dan foydalanishingiz mumkin. IMO barcha maydonlarni o'qiydigan tarzda aniq belgilash va harakat qilishni osonlashtiradi.
qo'shib qo'ydi muallif jathanism, manba
ammo butun modelini readonly_fields ro'yxatiga barcha xususiyatlarini qo'shishga hojat qoldirmaydi read_only sifatida ko'rsatish uchun bir usul bormi?
qo'shib qo'ydi muallif juliomalegria, manba

Django 1,8 ga tegishli testimga muvofiq, biz 3-javobda qayd etilganidek foydalana olmaymiz, lekin u Django 1.4 :

##     self.get_formset(request, obj)      ##
answer 3 needs fix. Generally, alternative codes for this issue about below section 
##          form = self.get_formset(request, obj).form    ##
##          fields = form.base_fields.keys()              ##

Quyidagi kabi bo'lishi mumkin:

#~ (A) or
[f.name for f in self.model._meta.fields]

#~ (B) or
MyModel._meta.get_all_field_names()

#~ (C) 
list(set([field.name for field in self.opts.local_fields] +
                        [field.name for field in self.opts.local_many_to_many]         
  ))
1
qo'shib qo'ydi

Menda shunga o'xshash stsenariy bor edi:

  1. Foydalanuvchi modeli moslamalarini yaratishi kerak
  2. Foydalanuvchi model namunalari ro'yxatini ko'rishlari kerak
  3. Foydalanuvchi SHOLD'NT yaratilgach ob'ektni tahrir qilishi mumkin.

1. O'zgartirish ko'rinishini bekor qilish

ModelAdminda change_view() kodini bekor qilish mumkin bo'lganligi sababli, biz yaratilgan model namunalarini tartibga solishning oldini olish uchun foydalana olamiz. Mana, men foydalangan misol:

def change_view(self, request, object_id, form_url='', extra_context=None):
    messages.error(request, 'Sorry, but editing is NOT ALLOWED')
    return redirect(request.META['HTTP_REFERER'])

2. Shartli ravishda O'zgartirishni o'zgartirish

Hujjatlarda ModelAdmin.has_change_permission() ning natijalarini turli yo'llar bilan sharhlayotganini angladim:

Obj tartibga solish ruxsat berilsa, haqiqatni qaytarish kerak, aks holda soxta. Agar   obj - yo'q bo'lsa, tartibga solish yoki yo'qligini ko'rsatish uchun "True" yoki "false" ga qaytsin   Bu turdagi narsalarning umuman olishi mumkin (masalan, noto'g'ri bo'ladi)   joriy foydalanuvchi foydalanuvchiga tahrirlash uchun ruxsat berilmagan deb talqin etiladi   Ushbu turdagi har qanday ob'ekt).

Buning ma'nosi obj None yoki True kodini qaytara olmasligini tekshirib ko'rdim, aks holda noto'g'ri bu aslida foydalanuvchilarga o'zgartirishlar ro'yxatini ko'rish imkonini beradi, lekin model namunasi saqlanganidan keyin change_formni tahrirlash yoki tahrirlash imkoni yo'q.

def has_change_permission(self, request, obj = None, **kwargs):
    if obj is None:
        return True
    else:
        return False

Buni istalgan kirimlarni o'zgarish ro'yxatini ko'rishga imkon beruvchi istalgan MODEL_can_change ruxsatnomalarini bekor qilishi mumkin, deb o'ylayman.

0
qo'shib qo'ydi