Tôi có một multivaluefield với một charfield và choicefield. Tôi cần phải vượt qua các lựa chọn để các nhà xây dựng choicefield, tuy nhiên khi tôi cố gắng vượt qua nó vào multivaluefield tùy chỉnh của tôi, tôi nhận được một lỗi __init__()
có một đối số từ khóa bất ngờ 'lựa chọn'.Django MultiValueField - Cách chuyển các lựa chọn cho ChoiceField?
Tôi biết phần còn lại của mã hoạt động vì khi tôi xóa đối số từ khóa lựa chọn từ __init__
và siêu, trường đa giá trị hiển thị chính xác nhưng không có bất kỳ lựa chọn nào.
Đây là cách tôi thiết lập của tôi multivaluefield tùy chỉnh:
class InputAndChoice(object):
def __init__(self, text_val='', choice_val=''):
self.text_val=text_val
self.choice_val=choice_val
class InputAndChoiceWidget(widgets.MultiWidget):
def __init__(self, attrs=None):
widget = (widgets.TextInput(),
widgets.Select()
)
super(InputAndChoiceWidget, self).__init__(widget, attrs=attrs)
def decompress(self,value):
if value:
return [value.text_val, value.choice_val]
return [None, None]
class InputAndChoiceField(forms.MultiValueField):
widget = InputAndChoiceWidget
def __init__(self, required=True, widget=None, label=None, initial=None,
help_text=None, choices=None):
field = (
fields.CharField(),
fields.ChoiceField(choices=choices),
)
super(InputAndChoiceField, self).__init__(fields=field, widget=widget,
label=label, initial=initial, help_text=help_text, choices=choices)
Và tôi gọi nó như vậy:
input_and_choice = InputAndChoiceField(choices=[(1,'first'),(2,'second')])
Vì vậy, làm thế nào để tôi vượt qua những lựa chọn để lĩnh vực ChoiceField của tôi?
Chỉnh sửa:
Tôi đã thử đề xuất của stefanw nhưng vẫn không có may mắn. Tôi đã sử dụng logging.debug để in ra các nội dung của InputAndChoiceField ở cuối init và self.fields [1] .choices chứa các giá trị đúng như trên, tuy nhiên nó không hiển thị bất kỳ lựa chọn nào trong trình duyệt.
Tôi vừa thử điều này nhưng tôi vẫn nhận được trường lựa chọn trống. Tôi đã kiểm tra và các lựa chọn được thông qua một cách chính xác mặc dù. Có suy nghĩ gì không? –
Có vẻ như bạn nên xây dựng một đối tượng 'trường' trước khi gọi hàm tạo MultiValueField, và sau đó chuyển giá trị 'trường' đó vào tham số đầu tiên của đối tượng siêu lớp. – mjumbewu