Django Foreign Keys Только для чтения - PullRequest
1 голос
/ 04 декабря 2008

У меня есть две модели, одна из которых - Сотрудник, а другая - Актив, со связью Многие к одному между Активом и Сотрудником. И Актив добавляется как поле StackedInline к интерфейсу Admin Сотрудника, есть ли в любом случае, я могу сделать Актив как поле только для чтения в Admin Сотрудника.

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

Ответы [ 5 ]

3 голосов
/ 04 декабря 2008

Редактировать: На самом деле, я не думаю, что это будет работать для встроенных моделей ..

Django будет добавлять собственные поля только для чтения в Django 1.1, который должен быть выпущен в середине марта.

Поля администратора только для чтения (http://www.djangosnippets.org/snippets/937/)

Этот фрагмент позволит вам устанавливать поля только для чтения в админке.

2 голосов
/ 03 июля 2009

используйте этот код и импортируйте его в admin.py как ReadonlyAdmin. Это измененная форма администратора только для чтения.

from django import forms
from django.utils.safestring import mark_safe
from datetime import datetime

class ReadOnlyWidget(forms.Widget):
    def __init__(self, original_value, display_value):
        self.original_value = original_value
        self.display_value = display_value
        super(ReadOnlyWidget, self).__init__()

    def render(self, name, value, attrs=None):
        if self.display_value is not None:
            return unicode(self.display_value)
        return unicode(self.original_value)

    def value_from_datadict(self, data, files, name):
        return self.original_value

#to make fields  foreignkey readonly

class ReadOnlyAdminFields(object):
    def get_form(self, request, obj=None):
        form = super(ReadOnlyAdminFields, self).get_form(request, obj)
        if hasattr(self, 'readonly') and obj is not None:
            for field_name in self.readonly:
                if field_name in form.base_fields:
                    if hasattr(obj, 'get_%s_display' % field_name):
                        display_value = getattr(obj, 'get_%s_display' % field_name)()
                    else:
                        display_value = None
                    if getattr(obj, field_name).__class__ in [unicode , long, int, float, datetime, list]:
                        form.base_fields[field_name].widget = ReadOnlyWidget(getattr(obj, field_name), display_value)
                    else:
                        form.base_fields[field_name].widget = ReadOnlyWidget(getattr(obj, field_name).id, display_value)
            form.base_fields[field_name].required = False
        return form
0 голосов
/ 20 февраля 2011

Если вы хотите отображать только активы сотрудника, вы можете изменить django admin по умолчанию change_form.html. (и вы также можете сначала отключить встроенный)

Чтобы переопределить шаблоны администратора по умолчанию, скопируйте папку шаблона администратора в локальную папку шаблонов django ($ {TEMPLATE_DIRS} в вашем файле setting.py)

А в change_form.html есть этот блок,

{% for inline_admin_formset in inline_admin_formsets %}
{% include inline_admin_formset.opts.template %}
{% endfor %}

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

А теперь вопрос: как я могу отобразить эту дополнительную информацию в этом шаблоне? Это можно сделать, переопределив функцию change_view () в модели администратора вашего сотрудника.

Например, в вашем admin.py

class EmployeeAdmin(admin.ModelAdmin):
    ...

    def change_view(self, request, object_id, extra_context=None):
        assets = Asset.objects.filter(employee=Employee.objects.get(id=object_id))
        context_data = {'inlines': assets, }
        return super(EmployeeAdmin, self).change_view(request, object_id, extra_context=context_data)

А теперь вернемся к change_form.html вашего администратора, используйте теги шаблона для отображения extra_context из вашего EmployeeAdmin.

например,

{% for inline in inlines %}
    {{ inline }}
{% endfor %}

{% for inline_admin_formset in inline_admin_formsets %}
{% include inline_admin_formset.opts.template %}
{% endfor %}

Надеюсь, это поможет, и это с django 1.2.4

0 голосов
/ 04 декабря 2008

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

0 голосов
/ 04 декабря 2008

Я не думаю, что в django-admin есть флаг для этого, за дополнительной информацией обратитесь к главе 18 книги Django, вам нужно будет взломать шаблоны вручную

http://www.djangobook.com/en/beta/chapter18/

...