Skip to content

Instantly share code, notes, and snippets.

@ajamaica
Created June 23, 2011 20:06
Show Gist options
  • Save ajamaica/1043502 to your computer and use it in GitHub Desktop.
Save ajamaica/1043502 to your computer and use it in GitHub Desktop.
ReadOnlyField On Admin Fixed for 1.3
from django.contrib import admin
import datetime
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)
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
return form
# Model
# field = ForeignKey(OtherMother)
# field2 = ManyToMany(OtherMother)
class ModelAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
ReadOnlyAdminFields.readonly = ('field','field2')
return super(ModelAdmin, self).get_form(request, obj, **kwargs)
admin.site.register(Model,ModeloAdmin)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment