在Django admin的change_form中的两个模型字段之间添加自定义html

mfa*_*con 4 python django django-admin

假设我有两个模型:

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)  
Run Code Online (Sandbox Code Playgroud)

有没有一种很好的方法在库change_form模板中的名称和地址之间添加一些html(只读输入字段)?我这样做会覆盖admin/includes/fieldset.html,但它变得凌乱,我找不到一种方法来显示html到底我想要的位置.例如,如果我想添加html,显示图书馆名称字段下面的图书数量,我会这样做:

{% for field in line %}
    ...
    {% if field.field.name == 'name' %}
        {{ field.field }}
        <div class="form-row total_books">
            <div>
                <label for="total_books">Total books:</label>
                <input type="text" maxlength="10" name="totbooks" id="totbooks" readonly="readonly">
            </div>
       </div>
    {% else %}
        {{ field.field }}
    {% endif %}
    ...
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

新解决方案:

我发现了一个更好的方法,但我不知道为什么会出现这个错误:"PresupuestoAdmin.readonly_fields 1,'name'不是可调用的,也不是PresupuestoAdmin的属性',或者在模型'Presupuesto'中找到".似乎"名称"字段未添加到管理员使用的表单中.

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) 
Run Code Online (Sandbox Code Playgroud)

Udi*_*Udi 9

models.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()
Run Code Online (Sandbox Code Playgroud)

admin.py:

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

admin.site.register(Library, LibraryAdmin)
Run Code Online (Sandbox Code Playgroud)


mfa*_*con 2

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',) 
Run Code Online (Sandbox Code Playgroud)