2011-09-02 33 views
14

Trong tài liệu, các nullbooleanfield được đại diện as a <select> box with "Unknown", "Yes" and "No" choices. Làm cách nào để thay đổi giá trị select thành một số văn bản có ý nghĩa khác và ánh xạ trở lại giá trị có, không có và không xác định trong số modelform của tôi?django: làm thế nào để thay đổi giá trị cho nullbooleanfield trong một mô hình?

Ví dụ: tôi có yes_no_required = models.NullBooleanField() và tôi muốn có 'yes I acknowledge this', 'no, I do not like this''I do not know now' ánh xạ tới có, không và bắt buộc tương ứng.

Trả lời

29

tôi đã dành nửa giờ đặt lại với nhau một bản demo chỉ để chứng minh bản thân mình để làm việc này:

CHOICES = (
    (None, "I do not know now"), 
    (True, "Yes I acknowledge this"), 
    (False, "No, I do not like this") 
) 

class Demo(models.Model): 
    yes_no_required = models.NullBooleanField(choices = CHOICES) 

class DemoForm(forms.ModelForm): 
    class Meta: 
     model = Demo 

tôi nhìn vào mã nguồn Django. Mọi thứ có thể chấp nhận một mảng lựa chọn. Rõ ràng, đối với một số những người không có ý nghĩa, nhưng nó có thể.

+3

Dường như Django thêm một lựa chọn khác cho Null vào FormFi các lựa chọn được chọn, vì null-attr được đặt đúng. Bạn cũng cần phải chuyển các lựa chọn cho FormField, để thực sự giới hạn nó cho các lựa chọn này và không phải là một lựa chọn null bị gạch ngang bổ sung. – codingjoe

+0

Điều này dường như không hoạt động nữa. 'TypeError: __init __() nhận đối số từ khóa không mong muốn 'options'' –

3

Bạn có thể xử lý này trong một hình thức (withouth sửa đổi các mô hình) như thế này:

forms.NullBooleanField(
    widget=forms.RadioSelect(renderer=HorizontalRadioRendererSpace, 
     choices=CHOICES), 
    label='...', 
    required=False) 

Tôi nghĩ rằng đó là một ý tưởng tồi để sử dụng NullBooleanField cho dữ liệu có thể được trong ba trạng thái như: yes/no/unset.

Chỉnh sửa dữ liệu hoạt động. Nhưng vấn đề lớn nảy sinh nếu bạn muốn viết một mẫu tìm kiếm cho dữ liệu này.

Sau đó, các giá trị "trống rỗng" có thể có hai nghĩa:

  • Đừng chăm sóc cho thuộc tính này. Bao gồm tất cả các hàng
  • Chỉ bao gồm các hàng này, trong đó cột là NULL.

Giải pháp rất đơn giản: Sử dụng ChoiceField.

Xem thêm chi tiết ở đây: https://github.com/guettli/programming-guidelines/blob/master/README.rst

2

Bạn có thể thay đổi phụ tùng lĩnh vực của bạn trong ModelForm bạn lớp meta:

CHOICES = (
      (None, "I do not know now"), 
      (True, "Yes I acknowledge this"), 
      (False, "No, I do not like this"), 
      ) 
class DemoForm(forms.ModelForm): 
    class Meta: 
     model = Demo 
     fields = ("demo_field",) 
     widgets = { 
       'demo_field': forms.RadioSelect(choices = CHOICES), 
        } 
1

cách tiếp cận đơn giản sẽ được thay đổi lựa chọn widget trong hình của bạn:

class YourForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(YourForm, self).__init__(*args, **kwargs) 
     new_choices = ((1, 'I do not know now'), 
         (2, 'Yes I acknowledge this'), 
         (3, 'No, I do not like this')) 
     self.fields['your_field'].widget.choices = new_choices 
Các vấn đề liên quan