Как я могу ИЗМЕНИТЬ django для создания разрешения “представления”?

Что является ссылкой C++ ( для программистов C )

А , ссылка может считаться постоянный указатель (чтобы не быть перепутанным с указателем на постоянную величину!) с автоматической косвенностью, т.е. компилятором будет применяться * оператор для Вас.

Все ссылки должны быть инициализированы с ненулевым значением, или компиляция перестанет работать. Ни возможно получить адрес ссылки - операция взятия адреса возвратит адрес значения, на которое ссылаются, вместо этого - и при этом не возможно сделать арифметику на ссылках.

программистам C могли бы не понравиться ссылки C++, поскольку больше не будет очевидно, когда косвенность произойдет или если аргумент передается значением или указателем, не смотря на функциональные подписи.

программистам на C++ могло бы не понравиться использовать указатели, поскольку их считают небезопасными - хотя ссылки не действительно так более безопасны, чем постоянные указатели кроме большинства тривиальных случаев - испытывают недостаток в удобстве автоматической косвенности и несут другую семантическую коннотацию.

Рассматривают следующее утверждение от C++ FAQ :

Даже при том, что ссылка часто реализуется с помощью адреса в базовом ассемблере, сделайте не , думают о ссылке как о забавно выглядящем указателе на объект. Ссылка объект. Это не указатель на объект, ни копия объекта. Это объект.

, Но если ссылка действительно была объектом, как мог бы там подвешивать ссылки? На неуправляемых языках для ссылок невозможно быть немного 'более безопасным', чем указатели - обычно просто нет способа надежно исказить значения через границы объема!

, Почему я считаю ссылки C++ полезными

Происхождение из среды C, ссылки C++ могут быть похожими на несколько глупое понятие, но нужно все еще использовать их вместо указателей где возможный: Автоматическая косвенность удобна, и ссылки становятся особенно полезными при контакте с RAII - но не из-за любого воспринятого преимущества безопасности, а скорее потому что они делают пишущий идиоматический код менее неловким.

RAII является одним из центрального понятия C++, но он взаимодействует нетривиально с копированием семантики. Передача объектов ссылкой избегает этих проблем, поскольку никакое копирование не включено. Если бы ссылки не присутствовали на языке, то необходимо было бы использовать указатели вместо этого, которые являются более громоздкими для использования, таким образом нарушая принцип разработки языка, что решение лучшей практики должно быть легче, чем альтернативы.

31
задан 13 revs, 2 users 100% 6 November 2011 в 15:00
поделиться

3 ответа

Возможность добавления полей только для чтения на вид администратора теперь включена в Django версию 1.2.

см. Номер билета 342 http://code.djangoproject.com/ticket/342

См. Смешивание № 11965 http://code.djangoproject.com/changeset/11965

См. Документация http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.modeladmin.readonly_fields

2
ответ дан 27 November 2019 в 22:14
поделиться

Вот как я изменил Django 1.0.2, чтобы добавить разрешения на просмотр. Извините, различий нет.

[X] 1. Added 'view' to default permission list

#./contrib/auth/management/__init__.py
def _get_all_permissions(opts):
    "Returns (codename, name) for all permissions in the given opts."
    perms = []
    for action in ('add', 'change', 'delete', 'view'):
        perms.append((_get_permission_codename(action, opts), u'Can %s %s' % (action, opts.verbose_name_raw)))
    return perms + list(opts.permissions)

[X] 2. Test the 'view' permission is added to all models

run manage.py syncdb

I confirmed that view permission is now added for all tables in the auth_permissions table

[X] 3. Add "get_view_permission" to default model class.

Added get_view_permission to the model class. You can find this in the file ./db/models/options.py This is used by the admin class in the next step.

def get_view_permission(self):
    return 'view_%s' % self.object_name.lower()

[X] 4. Добавьте «has_view_permission» к классу администратора по умолчанию

Чтобы быть последовательным, я собираюсь добавить «has_view_permission» в систему. Похоже, он должен быть где-то в contrib / admin / options.py . Убедитесь, что у пользователя есть разрешение на изменение, тогда разрешения на просмотр автоматически подразумеваются.

# /contrib/admin/options.py
# Added has_view_permissions
def has_view_permission(self, request, obj=None):
    """
    Returns True if the given request has permission to change or view
    the given Django model instance.

    If `obj` is None, this should return True if the given request has
    permission to change *any* object of the given type.
    """
    opts = self.opts
    return self.has_change_permission(request, obj) or \
        request.user.has_perm(opts.app_label + '.' + opts.get_view_permission())

# modified get_model_perms to include 'view' too.
# No idea where this may be used, but trying to stay consistent
def get_model_perms(self, request):
        """
        Returns a dict of all perms for this model. This dict has the keys
        ``add``, ``change``, and ``delete`` and ``view`` mapping to the True/False
        for each of those actions.
        """
        return {
            'add': self.has_add_permission(request),
            'change': self.has_change_permission(request),
            'delete': self.has_delete_permission(request),
            'view': self.has_view_permission(request),
        }

# modified response_add function to return the user to the mode list
# if they added a unit and have view rights
... 
    else:
        self.message_user(request, msg)

        # Figure out where to redirect. If the user has change permission,
        # redirect to the change-list page for this object. Otherwise,
        # redirect to the admin index.
        #if self.has_change_permission(request, None):
        if self.has_change_permission(request, None) or self.has_view_permission(request, None):
            post_url = '../'
        else:
            post_url = '../../../'
        return HttpResponseRedirect(post_url)

 # modified the change_view function so it becomes the details 
 # for users with view permission

    #if not self.has_change_permission(request, obj):
    if not (self.has_change_permission(request, obj) or (self.has_view_permission(request, obj) and not request.POST)):
        raise PermissionDenied


  # modified the changelist_view function so it shows the list of items
  # if you have view permissions
def changelist_view(self, request, extra_context=None):
    "The 'change list' admin view for this model."
    from django.contrib.admin.views.main import ChangeList, ERROR_FLAG
    opts = self.model._meta
    app_label = opts.app_label
    #if not self.has_change_permission(request, None):
    if not (self.has_change_permission(request, None) or self.has_view_permission(request, None)):
        raise PermissionDenied

[X] 5. Обновите шаблон по умолчанию для отображения моделей, если у пользователя есть разрешение на просмотр.

Я изменил шаблон по умолчанию в contrib / admin / templates / admin / index.html. С этим также можно справиться, скопировав файл в локальный каталог шаблонов. Я внес изменения в оба, поэтому у меня есть копия, если более позднее обновление перезапишет мои изменения.

 {% for model in app.models %}
            <tr>
            {% if model.perms.change %}
                <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
            {% else %}
                {% if model.perms.view %}
                    <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
                {% else %}
                    <th scope="row">{{ model.name }}</th>
                {% endif %}
            {% endif %}

[X] 6. Подтвердите, что пользователь может "просматривать", но не "изменять" модель.

Найден contrib / admin / templatetags / admin_modify.py для управления отображением кнопок сохранения / сохранения и продолжения. В поле «Сохранить» по умолчанию изменено значение «Всегда Истина» для проверки контекста и разрешений. Пользователь должен иметь возможность сохранять, если у него есть права на изменение или добавление.

 'show_save': (change and context['has_change_permission']) or (context['add'] and context['has_add_permission'])

[X] 7. Удалите кнопку «Сохранить и добавить еще», если пользователь просматривает элемент.

Снова изменил contrib / admin / templatetags / admin_modify.py. Я не знаю, что означает «save_as», так что, возможно, я что-то сломал, но похоже, что это работает.

    #'show_save_and_add_another': context['has_add_permission'] and
    #                    not is_popup and (not save_as or context['add']) ,
    'show_save_and_add_another': not is_popup and
        (( change and context['has_change_permission']) or (context['add'] and context['has_add_permission']))
        and
        (not save_as or context['add']),

[X] 8. Измените разрешение «просмотр», чтобы сделать форму только для чтения

Если пользователь имеет разрешение «просмотр» и разрешение «изменение», ничего не делать. Изменение отменяет представление.

Если у пользователя есть разрешение на «просмотр» без «изменения», измените формы по умолчанию и добавьте атрибуты DISABLED или READONLY к элементам формы. Не все браузеры поддерживают это, но для моих целей я могу потребовать, чтобы пользователи использовали правильный. Пример отключено / только для чтения

Обнаружено, что не все браузеры поддерживают «только чтение», поэтому некоторые элементы управления устанавливаются в режим «только чтение», а другие - в отключенное состояние. Это позволяет пользователям при необходимости копировать данные из текстовых элементов управления.

#/django/contrib/admin/templates/admin/change_form.html

{# JavaScript for prepopulated fields #}
{% prepopulated_fields_js %}

</div>
</form></div>
{% if has_view_permission and not has_change_permission %}
    <script type="text/javascript">
    jQuery('input:text').attr('readonly', 'readonly');
    jQuery('textarea').attr('readonly', 'readonly');
    jQuery('input:checkbox').attr('disabled', true);
    jQuery('select').attr('disabled', true);
    jQuery('.add-another').hide();
    </script>
{% endif %}
35
ответ дан 27 November 2019 в 22:14
поделиться

Это прямо в админке. Вы можете установить разрешения для пользователей и групп в админке, чтобы добавлять, изменять и удалять определенные модели.

Обновление: Извините, я неправильно понял вопрос, потому что я неправильно истолковал слово «представление», придав ему значение Django, а не «читать» -только". Если вы хотите использовать администратора только для чтения, я думаю, вам нужно немного поработать. См. эту ветку , где Джеймс Беннетт (менеджер выпуска Django) говорит:

Как вы найдете, выполнив поиск в архивы этого списка, это не что-то административный интерфейс Django предназначен для поддержки, и поэтому любой решение нужно будет прийти полностью от вас, написавшего свой собственный код.

и

Администратор Django оперирует тремя разрешения: «добавить», «изменить» и "удалять". Нет "вид, но сделай" нет разрешения на внесение изменений, следовательно нет возможности применить такой ограничение без значительных пользовательское кодирование.

Дополнительная работа будет включать в себя добавление разрешения «только для чтения» для определенных моделей и изменение базовых шаблонов администратора, чтобы проверить, есть ли у пользователя это разрешение, и, если да, отключение определенных элементов управления (например, кнопок сохранения) и сделать другие доступными только для чтения. Это предотвратит случайное вмешательство, но вам также может потребоваться изменить логику на стороне сервера, чтобы проверить то же разрешение, чтобы избежать любых POST-запросов, созданных скрытым способом для обхода разрешений.

6
ответ дан 27 November 2019 в 22:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: