Добавьте пользовательский html между двумя модельными полями в change_form администратора Django - PullRequest
4 голосов
/ 05 июня 2011

Допустим, у меня есть две модели:

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)  

Есть ли хороший способ добавить html (поле ввода только для чтения) между именем и адресом в шаблоне библиотеки change_form ?. Я делаю это, переопределяя 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 %}

Новое решение:

Я нашел более хороший способ, как мне кажется, но я не знаю, почему я получаю эту ошибку: "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) 

Ответы [ 3 ]

9 голосов
/ 14 июня 2011

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()

admin.py:

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

admin.site.register(Library, LibraryAdmin)
2 голосов
/ 09 июня 2011
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',) 
2 голосов
/ 06 июня 2011

Это может не дать вам именно то, что вам нужно, но вы можете переопределить виджет для поля bar в модели Foo, добавив его в 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'<br/><b>Hello world!</b>')

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...