переменные как параметры в полевых параметрах - PullRequest
2 голосов
/ 16 октября 2008

Я хочу создать модель, которая установит editable = False при создании и editable = True при редактировании элемента. Я думал, что это должно быть примерно так:

 home = models.ForeignKey(Team, editable=lambda self: True if self.id else False)

Но это не работает. Может быть, что-то с переопределением init может помочь мне, но я не уверен, что может помочь. Я знаю, что могу проверить self.id в методе save (), но уже слишком поздно, я хочу, чтобы такая логика применялась в приложении администратора при заполнении полей.

1 Ответ

4 голосов
/ 16 октября 2008

Добавьте следующее (небольшое расширение этот код ) к вашему admin.py:

from django import forms

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

class ReadOnlyAdminFields(object):
    def get_form(self, request, obj=None):
        form = super(ReadOnlyAdminFields, self).get_form(request, obj)
        fields = getattr(self, 'readonly', [])
        if obj is not None:
            fields += getattr(self, 'readonly_on_edit', [])

        for field_name in fields:
            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

                form.base_fields[field_name].widget = ReadOnlyWidget(getattr(obj, field_name, ''), display_value)
                form.base_fields[field_name].required = False

        return form

Затем можно указать, что определенные поля должны быть доступны только для чтения при редактировании объекта:

class PersonAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
    readonly_on_edit = ('home',)

admin.site.register(Person, PersonAdmin)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...