255👍
Use Readonly Fields. Like so (for django >= 1.2):
class MyModelAdmin(admin.ModelAdmin):
readonly_fields=('first',)
19👍
Update
This solution is useful if you want to keep the field editable in Admin but non-editable everywhere else. If you want to keep the field non-editable throughout then @Till Backhaus’ answer is the better option.
Original Answer
One way to do this would be to use a custom ModelForm
in admin. This form can override the required field to make it editable. Thereby you retain editable=False
everywhere else but Admin. For e.g. (tested with Django 1.2.3)
# models.py
class FooModel(models.Model):
first = models.CharField(max_length = 255, editable = False)
second = models.CharField(max_length = 255)
def __unicode__(self):
return "{0} {1}".format(self.first, self.second)
# admin.py
class CustomFooForm(forms.ModelForm):
first = forms.CharField()
class Meta:
model = FooModel
fields = ('second',)
class FooAdmin(admin.ModelAdmin):
form = CustomFooForm
admin.site.register(FooModel, FooAdmin)
- [Django]-Django datetime issues (default=datetime.now())
- [Django]-Django url tag multiple parameters
- [Django]-Django DB Settings 'Improperly Configured' Error
14👍
Add the fields you want to display on your admin page.
Then add the fields you want to be read-only.
Your read-only fields must be in fields
as well.
class MyModelAdmin(admin.ModelAdmin):
fields = ['title', 'author', 'published_date', 'updated_date', 'created_date']
readonly_fields = ('updated_date', 'created_date')
- [Django]-Django Reverse with arguments '()' and keyword arguments '{}' not found
- [Django]-How to change a django QueryDict to Python Dict?
- [Django]-Django manage.py runserver invalid syntax
4👍
You could also set the readonly fields as editable=False
in the model (django doc reference for editable
here). And then in the Admin overriding the get_readonly_fields
method.
# models.py
class MyModel(models.Model):
first = models.CharField(max_length=255, editable=False)
# admin.py
class MyModelAdmin(admin.ModelAdmin):
def get_readonly_fields(self, request, obj=None):
return [f.name for f in obj._meta.fields if not f.editable]
- [Django]-How to perform OR condition in django queryset?
- [Django]-STATIC_ROOT vs STATIC_URL in Django
- [Django]-Gunicorn autoreload on source change
1👍
With the above solution I was able to display hidden fields for several objects but got an exception when trying to add a new object.
So I enhanced it like follows:
class HiddenFieldsAdmin(admin.ModelAdmin):
def get_readonly_fields(self, request, obj=None):
try:
return [f.name for f in obj._meta.fields if not f.editable]
except:
# if a new object is to be created the try clause will fail due to missing _meta.fields
return ""
And in the corresponding admin.py file I just had to import the new class and add it whenever registering a new model class
from django.contrib import admin
from .models import Example, HiddenFieldsAdmin
admin.site.register(Example, HiddenFieldsAdmin)
Now I can use it on every class with non-editable fields and so far I saw no unwanted side effects.
- [Django]-Django 1.7 throws django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet
- [Django]-How to add superuser in Django from fixture
- [Django]-What is the Simplest Possible Payment Gateway to Implement? (using Django)
0👍
You can try this
@admin.register(AgentLinks)
class AgentLinksAdmin(admin.ModelAdmin):
readonly_fields = ('link', )
- [Django]-How can I call a custom Django manage.py command directly from a test driver?
- [Django]-Django QuerySet order
- [Django]-Django.db.utils.IntegrityError: duplicate key value violates unique constraint "django_migrations_pkey"
0👍
You can display editable=False
fields with readonly_fields as shown below:
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
readonly_fields = ('updated_date', 'created_date')
And, if assigning editable=False
fields to fields, you also need to assign them to readonly_fields
as shown below:
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
fields = ('updated_date', 'created_date')
readonly_fields = ('updated_date', 'created_date')
Because, if only assigning editable=False
fields to fields
without assigning them to readonly_fields
as shown below:
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
fields = ('updated_date', 'created_date')
# readonly_fields = ('updated_date', 'created_date')
Then, the error below occurs:
django.core.exceptions.FieldError: ‘updated_date’ cannot be specified
for MyModel model form as it is a non-editable field. Check
fields/fieldsets/exclude attributes of class MyModelAdmin.
- [Django]-What is a "slug" in Django?
- [Django]-Django-celery: No result backend configured
- [Django]-How to manually assign imagefield in Django