2011-06-04 70 views
4

比方說,我有兩個型號:在Django管理的change_form兩個型字段之間添加自定義HTML

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'中找到的」。看起來'name'字段沒有添加到管理員使用的表單中。

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) 

回答

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',) 
2

這可能不是給你你需要什麼,但你可以在模型Foo加給你的admin.py覆蓋部件爲外地bar

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) 
+0

謝謝烏迪,我想我張貼的解決方案可能是更清潔。 – mfalcon 2011-06-08 13:52:03

+0

我添加了一個更好的解決方案(http://stackoverflow.com/questions/6239966/add-custom-html-between-two-model-fields-in-django-admins-change-form/6343271#6343271).. (ahm ...我現在應該投我以前的答案嗎?) – Udi 2011-06-14 12:14:08

8

模型。 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)