Agregue html personalizado entre dos campos de modelo en el formulario de cambio del administrador de Django

Digamos que tengo dos modelos:

class Book(models.Model): name = models.CharField(max_length=50) library = models.ForeignKeyField('Library') class Library(models.Model): name = models.CharField(max_length=50) address = models.CharField(max_length=50) tel = models.CharField(max_length=50) 

¿Hay una buena manera de agregar algún html (un campo de entrada de solo lectura) entre el nombre y la dirección en la plantilla de cambio de forma de la Biblioteca? Lo hago anulando admin / includes / fieldset.html pero se está complicando y no puedo encontrar la manera de mostrar el html exactamente donde quiero. Por ejemplo, si quiero agregar html que muestre la cantidad de libros que la biblioteca tiene debajo del campo de nombre, haré esto:

 {% for field in line %} ... {% if field.field.name == 'name' %} {{ field.field }} 
{% else %} {{ field.field }} {% endif %} ... {% endfor %}

Nueva solución:

Creo que encontré una forma más agradable, pero no sé por qué recibo este error: “PresupuestoAdmin.readonly_fields 1 , ‘nombre’ no es un nombre o atributo de PresupuestoAdmin ‘o se encuentra en el modelo’ Presupuesto ‘ “. Parece que el campo ‘nombre’ no se agrega al formulario utilizado por el administrador.

 class FoooAdminForm(forms.ModelForm): name = models.CharField(max_length=100) class Meta: model = Foo class FooAdmin(admin.ModelAdmin): form = FooAdminForm fieldsets = ( (None, { 'fields': ('id', 'name', 'date')}), ) readonly_fields = ('id', 'name') admin.site.register(Foo, FooAdmin) 

modelos.py:

 class Library(models.Model): name = models.CharField(max_length=50) address = models.CharField(max_length=50) tel = models.CharField(max_length=50) def book_count(self): return self.book_set.count() 

admin.py:

 class LibraryAdmin(admin.ModelAdmin): fieldsets = ( (None, { 'fields': ('name', 'book_count', 'address', 'tel' )}), ) readonly_fields = ('book_count',) admin.site.register(Library, LibraryAdmin) 

Es posible que esto no le dé exactamente lo que necesita, pero puede anular el widget para la bar campo en el modelo Foo agregando esto a su admin.py :

 from django import forms from django.contrib import admin from django.contrib.admin import site from django.contrib.admin.widgets import AdminTextInputWidget from django.utils.safestring import mark_safe from models import Foo class AdminFooWidget(AdminTextInputWidget): def render(self, name, value, attrs=None): s = super(AdminTextInputWidget, self).render(name, value, attrs) return mark_safe(s+u'
Hello world!') class FooAdminForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(FooAdminForm, self).__init__(*args, **kwargs) self.fields['bar'].widget = AdminFooWidget() class FooAdmin(admin.ModelAdmin): form = FooAdminForm site.register(Foo, FooAdmin)
 class FooAdminForm(forms.ModelForm): name = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'readonly': 'readonly'})) def __init__(self, *args, **kwargs): super(FooAdminForm, self).__init__(*args, **kwargs) self.fields['name'].required = False if kwargs.has_key('instance'): instance = kwargs['instance'] # do something with the instance here if you want class Meta: model = Foo class FooAdmin(admin.ModelAdmin): form = FooAdminForm fieldsets = ( (None, { 'fields': ('id', 'name',),}) ) readonly_fields = ('id',)