Толық үлгі тек оқуға арналған

Django әкімшісінде тек оқуға арналған үлгісін жасаудың тәсілі бар ма? бірақ мен бүкіл модельді білдіремін. Мәселен, ешқандай қосу, жою, өзгертпеу, объектілер мен өрістерді қарап шығу, барлығы оқу үшін ғана бар ма?

13
Бұл жұмыс жалғасуда: github.com/django/django/pull/5297
қосылды автор Bosco, көзі

5 жауаптар

ModelAdmin hook get_readonly_fields() функциясын қамтамасыз етеді - келесі тексерілмеген, менің ойым барлық өрістерді ModelAdmin әдісі арқылы оқуға арналған өрістердің өздеріне арналған рекурсияға қосылмай-ақ анықтауға мүмкіндік береді:

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

сосын тек оқуға арналған әкімші болуы керек болса, бұл әкімшіге қосалқы сынып/араластырыңыз.

Қосу/жою және олардың түймелерін жоғалту үшін сіз қосқыңыз келуі мүмкін

    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-те, has_change_permission (іздеу немесе қайта анықтау) False мәнін қайтарады, сіз нысанды өзгерту көрінісіне жете алмайсыз және оған сілтеме көрсетілмейді. Бұл шын мәнінде әдемі болар еді, әйтпесе get_readonly_fields() өзгеріс рұқсатын тексерді және барлық өрістерді сол сияқты жоғарыда көрсетілгендей етіп орнатады. Осылайша, өзгермейтіндер кем дегенде деректерді қарап шығуы мүмкін ... егер jathanism деп атап өткендей, ағымдағы әкімші құрылымы view = edit деп қарастырса, бұл қосу/өзгерту/жою үстіне «қарау» рұқсатын енгізуді талап етуі мүмкін ...

ӨҢДЕУ: барлық өрістерді оқуға арналған, сонымен бірге тексерілмеген, бірақ перспективалы болып көрінетін:

readonly_fields = MyModel._meta.get_all_field_names()

EDIT: Міне, басқа

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
қосылды
PS: Енді осы мүмкіндікті қолдануға мүмкіндік алдым code.djangoproject.com/ticket/17295
қосылды автор Danny W. Adair, көзі
Ескерту: get_formset әдісі InlineModelAdmin үшін ғана анықталған
қосылды автор Vajk Hermecz, көзі
Hi, бұл опциялардың жинағы үшін рақмет. Мүмкін сыпайы болуы мүмкін, бірақ сізде алынған бөлімдердің жауаптарына сілтемелерді қамтамасыз ету үшін, мен олардың бәрі емес екенін көремін. Бұдан басқа, оқырмандар өз ұсыныстарын әрқайсысы жасаған пікірлерін көре алады.
қосылды автор steps, көзі
Django 1.11-де жұмыс істемейді - AttributeError: 'ReadOnlyAdmin' нысанында 'declared_fieldsets'
қосылды автор turbotux, көзі

«Көру рұқсаттары» ретінде оны Django 1.11-ке жасамайды , өкінішке орай, , no-op үлгісінің журналының жазбаларын қосу және модель өзгерістерін сақтау сияқты ModelAdmin-ді оқуға арналған арқылы жасайтын шешім.

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

( ЕСКЕРТПЕ: false no-op көмекшісін False дегенмен қате жасамаңыз. сынып оны сыныпқа жылжытады, оны no_op деп атайды немесе басқа бір нәрсе деп атайды немесе әдеттегі def . ..)

Бұл:

  1. тізім көрінісінде әрекеттер ашылмалы терезесін («жою») алып тастаңыз
  2. жаңа үлгілік жазбаларды қосуды рұқсат етпеу
  3. қолданыстағы модель жазбаларын жоюға тыйым салынады
  4. үлгі журналында журнал жазбаларын жасаудан аулақ болыңыз
  5. сақтаудан кейін «сәтті өзгертілген» хабарларды көрсетпеу
  6. дерекқорға өзгертулерді өзгертуді болдырмау

Бұл:

  • «Сақтау және өңдеуді жалғастыру» және «САҚТАУ» деген екі түймені алып тастаңыз немесе ауыстырыңыз (бұл пайдаланушы тәжірибесін жақсарту үшін жақсы болады)

get_all_field_names (қабылданған жауапта айтылғандай) Django 1.10 ішінен жойылды . Django 1.10.5 сынақтан өтті.

3
қосылды

ModelAdmin сыныптарын readonly_fields төлсипаты. Көбірек білу үшін бұл жауап бөлімін қараңыз.

2
қосылды
Бар, бірақ оңай емес. Сіз Django-да теңшелетін рұқсаттарды жасай аласыз, бірақ әкімші сайтына қатысты бұл тримус емес. Django егер адамдар әкімші интерфейсіндегі мазмұнды көруге рұқсат етілсе, оларды өңдеуге рұқсат етіледі деп есептейді. Бұл сұрақты батыл сезінсеңіз, ұсынысты сынап көріңіз. IMO барлық өрістерді нақты оқып, әрі қарай жылжыту оңайырақ.
қосылды автор jathanism, көзі
бірақ бүкіл үлгісін readonly_fields тізіміне барлық атрибуттарын қосудың қажеті жоқ, оқу_онлы ретінде жасау тәсілі бар ма?
қосылды автор juliomalegria, көзі

Джанго 1.8 тестім бойынша біз # 3 жауапта көрсетілгендей пайдаланбаймыз, бірақ ол 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()              ##

Ұқсас нәрсе болуы мүмкін:

#~ (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
қосылды

Менде осындай сценарий болды:

  1. Пайдаланушы үлгі нысандарын жасауға қабілетті болуы керек
  2. Пайдаланушы үлгі нысандарының тізімін қарап шығу керек
  3. Пайдаланушы SHOULD'NT оны жасағаннан кейін нысанды өңдей алады.

1. Өзгерту көрінісін қайта жазу

ModelAdmin ішіндегі change_view() параметрін алдын-ала белгілеу мүмкін болғандықтан, біз оны жасағаннан кейін үлгілік даналарды өңдеуді болдырмау үшін пайдаланамыз. Мен пайдаланған мысал:

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. Рұқсатты өзгерту шарттарын өзгерту

Мен сондай-ақ құжаттардың ModelAdmin.has_change_permission() нәтижесін түрлі жолдармен түсіндіретінін түсіндім:

Өңдеуді рұқсат етілсе, True мәнін қайтару керек. Егер   obj - None, True немесе False мәндеріне қайтару керек пе дегенді білдіреді   осы типтегі объектілерге жалпы рұқсат етіледі (мысалы, жалған болады)   ағымдағы пайдаланушыға өңдеуге рұқсат етілмейді деп түсіндіріледі   кез келген объект).

obj - бұл True кодын қайтаратындығын тексердім, әйтпесе False дегенді қайтарамын және бұл қолданушыларға өзгеріс тізімін көруге мүмкіндік береді, бірақ үлгі данасы сақталғаннан кейін change_form параметрін өңдей алмайды немесе көре алмайды.

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

Бұл ойланып отырған көздерді өзгерту тізімін көруге мүмкіндік беретін кез-келген MODEL_can_change рұқсаттарын елемеуі мүмкін деп ойлаймын.

0
қосылды