2012-09-08 30 views
14

Câu hỏi của người mới Django: Tôi muốn quản trị viên Django hiển thị nhiều hàng lựa chọn hơn trong tiện ích đa lựa chọn. Tôi có một danh sách rất dài để chọn và 4 hàng mặc định không thuận tiện, đặc biệt là khi cuộn.Kích thước ghi đè của Django Admin Multi-select Widget

Hiện tại, tiện ích con được hiển thị là chọn nhiều nhưng tôi muốn nó là chọn nhiều kích thước = "12". Lý tưởng nhất là điều này nên cho các trường cụ thể, nhưng tôi có thể sống với tất cả các trường hiển thị với cùng thuộc tính kích thước.

Vậy đâu là nơi tối ưu ở Django để thay đổi điều đó?

Trả lời

13

Nếu bạn có lựa chọn dài sẽ tiếp tục phát triển, tôi khuyên bạn nên sử dụng một số autocomplete widget.

Dù sao, bạn có thể:

  1. Create a ModelForm, cho mô hình trong câu hỏi

  2. Override the default widget, cho lĩnh vực trong câu hỏi,

  3. Set widget's size attribute để bạn cần

  4. Enable that form in ModelAdmin, ví dụ

    class YourModelForm(forms.ModelForm): 
        class Meta: 
         model = YourModel 
         widgets = { 
          'your_field': forms.SelectMultiple(attrs={'size': 12}) 
         } 
    
    
    class YourModelAdmin(admin.ModelAdmin): 
        form = YourModelForm 
    
19

Tôi đã làm điều này trong admin.py bằng cách thiết lập một kích thước chăn cho tất cả các mục ManyToManyField, ví dụ:

from django.contrib import admin 
from django.forms import SelectMultiple 
from django.db import models 
from models import * 

class RiverAdmin(admin.ModelAdmin): 
    formfield_overrides = { models.ManyToManyField: {'widget': SelectMultiple(attrs={'size':'10'})}, } 

admin.site.register(River, RiverAdmin) 
+0

+1 vì đơn giản – JeffC

+2

Lưu ý rằng điều này sẽ không hoạt động nếu 'filter_horizontal' hoặc' filter_vertical' được thiết lập cho các trường tương ứng trong 'RiverAdmin'. Tôi đã dành chút thời gian để tìm ra điều này. –

0

tôi đã có thể tạo số hàng theo số lượng ban đầu của các hàng trong bảng có liên quan, tuy nhiên nó không cập nhật động (có thể cần phải chèn Javascript vào quản trị viên cho m và số truy vấn của các hàng thông qua AJAX, sẽ quá lớn để đăng ở đây).

class ProfileAdminForm(forms.ModelForm): 
    class Meta: 
     model = Profile 
     fields = '__all__' 
     widgets = { 
      # Will dynamically change number of rows in select multiple, however only after server reload. 
      'spec_profiles': forms.SelectMultiple(attrs={'size': SpecProfile.objects.count()}) 
     } 

class ProfileAdmin(admin.ModelAdmin): 
    form = ProfileAdminForm 
Các vấn đề liên quan