2009-08-10 33 views
14

Tôi đang tạo một mẫu hồ sơ ở Django. Có rất nhiều trường cấu hình phụ tùy chọn nhưng tôi chỉ muốn hiển thị hai trường cùng một lúc. Làm cách nào để ẩn hoặc xóa các trường mà tôi không muốn hiển thị động?Làm thế nào để bạn tự động ẩn các trường biểu mẫu trong Django?

Dưới đây là những gì tôi có cho đến nay:

class UserProfileForm(forms.ModelForm): 
    extra_fields = ('field1', 'field2', 'field3') 
    extra_field_total = 2 

    class Meta: 
     model = UserProfile 

    def __init__(self, *args, **kwargs): 
     extra_field_count = 0 
     for key, field in self.base_fields.iteritems(): 
      if key in self.extra_fields: 
       if extra_field_count < self.extra_field_total: 
        extra_field_count += 1 
       else: 
        # do something here to hide or remove field 
     super(UserProfileForm, self).__init__(*args, **kwargs) 
+0

Câu trả lời liên quan: http://stackoverflow.com/a/1914812/462865 –

Trả lời

14

Tôi nghĩ rằng tôi đã tìm thấy câu trả lời của mình.

Đầu tiên tôi đã cố gắng:

field.widget = field.hidden_widget 

mà không làm việc.

Cách đúng sẽ xảy ra là:

field.widget = field.hidden_widget() 
0

Bạn đang mã hóa này trong Form. Nó sẽ không có ý nghĩa hơn để làm điều này bằng cách sử dụng CSS và JavaScript trong mã mẫu? Ẩn một trường dễ dàng như thiết lập "display = 'none'" và chuyển nó trở lại 'block', nếu bạn cần hiển thị nó.

Có thể một số ngữ cảnh về yêu cầu sẽ làm rõ điều này.

+3

Thứ nhất, chỉ vì tôi nghĩ rằng biểu mẫu logic nên ở trong biểu mẫu. Ngoài ra, bởi vì tôi thấy những trường nào đã được điền trước và không hiển thị những trường đó. –

+1

Thao tác này chuyển logic nghiệp vụ vào lớp trình bày ("các đối tượng này không có trường này"). Đặc biệt tệ nếu nhà phát triển web KHÔNG phải là nhà phát triển phụ trợ. –

3

cũng có thể sử dụng

def __init__(self, instance, *args, **kwargs):  
    super(FormClass, self).__init__(instance=instance, *args, **kwargs) 
    if instance and instance.item: 
     del self.fields['field_for_item'] 
3
def __init__(self, *args, **kwargs): 
      is_video = kwargs.pop('is_video') 
      is_image = kwargs.pop('is_image') 
      super(ContestForm, self).__init__(*args, **kwargs) 
      if is_video: 
       del self.fields['video_link'] 
       #self.exclude('video_link') 
      if is_image: 
       del self.fields['image'] 

sử dụng xóa thay vì self.exclude.

Các vấn đề liên quan