2009-08-14 32 views
6

Tôi đã có một mô hình trong Django, mã ví dụ dưới đây (không mã thực tế của tôi):Kiểm soát Django ModelForm đầu ra

class Department(models.Model): 
    name = models.CharField(max_length=100) 
    abbreviation = models.CharField(max_length=4) 

Hãy nói rằng tôi làm như sau trong vỏ Django:

>>> Department(name='Computer Science',abbreviation='C S ').save() 
>>> Department(name='Mathematics',abbreviation='MATH').save() 
>>> Department(name='Anthropology',abbreviation='ANTH').save() 

Bây giờ tôi có bốn phòng ban được lưu trữ trong cơ sở dữ liệu của tôi. Giả sử chúng ta có một lớp học, Course, mà thuộc về một Department:

class Course(models.Model): 
    department = models.ForeignKey('Department') 
    number = models.IntegerField() 

class CourseForm(ModelForm): 
    class Meta: 
     model = Course 

Nếu tôi làm cho đối tượng ModelForm trực tiếp trong một mẫu bằng cách chỉ referncing một biến, nói form, mà đã truyền lại, Cục xuất hiện trong một hộp thả xuống (hộp chọn HTML). Càng xa càng tốt.

Vấn đề là: các mục trong hộp chọn được sắp xếp theo ID. Vì vậy, họ xuất hiện như:

  1. Khoa học máy tính
  2. Toán
  3. Nhân học

Nhưng, tôi muốn họ được sắp xếp theo thứ tự abc, tức là

  1. Nhân học
  2. Khoa học máy tính
  3. Toán

Làm cách nào tôi có thể thay đổi cách các mục này được sắp xếp theo mã số ModelForm hoặc trong mã Model, thay vì trong mẫu?

Và nói chung, làm cách nào tôi có thể tùy chỉnh cách một trường hoặc tiện ích cụ thể hoạt động khi được tạo bởi một ModelForm?

Trả lời

9

Làm cách nào để thay đổi cách các mục này được sắp xếp trong mã ModelForm hoặc trong mã Mẫu, chứ không phải trong mẫu?

Một điều bạn có thể làm là thêm orderingmeta option. Bạn làm điều này bằng cách thêm một lớp bên trong Meta đến một lớp học, với ordering thuộc tính quy định:

class Department(models.Model): 
    name = models.CharField(max_length=100) 
    abbreviation = models.CharField(max_length=4) 

    class Meta: 
     ordering = ["name"] 

Lưu ý rằng điều này thay đổi trật tự mặc định cho Department mô hình (không chỉ là khi được sử dụng trong một hình thức).

Và nói chung, làm cách nào tôi có thể tùy chỉnh cách một trường hoặc tiện ích cụ thể hoạt động khi được tạo bởi ModelForm?

Bạn sẽ muốn đọc tài liệu Django về ModelFormbuilt-in form fields. Đặc biệt, hãy chú ý đến thuộc tính tùy chọn widget, cho phép bạn thay đổi tiện ích của trường biểu mẫu. Các loại tiện ích khác nhau được mô tả here.

+0

Cảm ơn! Điều này không chính xác những gì tôi đang tìm kiếm. –

+0

Wow - câu trả lời tuyệt vời! – sage

1

mipadi đã chỉ cho bạn cách sửa đổi thứ tự cho mô hình Sở của bạn và điều này được phản ánh trong tiện ích biểu mẫu.

Tuy nhiên, nếu bạn chỉ muốn thay đổi thứ tự cho widget đó, và để tự mặc định của mô hình như cái gì khác, bạn có thể làm điều này:

class CourseForm(ModelForm): 
    department = forms.ModelChoiceField(
          queryset=Department.objects.order_by('name')) 

    class Meta: 
     model = Course 
Các vấn đề liên quan