2009-03-18 29 views
83

Đây là tuyên bố lĩnh vực trong một hình thức:Thiết lập giá trị được lựa chọn trên một Django forms.ChoiceField

max_number = forms.ChoiceField(widget = forms.Select(), 
        choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,) 

Tôi muốn thiết lập giá trị ban đầu là 3 và điều này dường như không làm việc. Tôi đã chơi về với param, báo giá/không có dấu ngoặc kép, vv ... nhưng không có thay đổi.

Một vài kết quả tôi đã tìm thấy thông qua Google đề xuất có thể đặt giá trị ban đầu nhưng tôi chưa bao giờ quản lý để làm cho nó hoạt động! Tôi đang trên django 1.0 bằng cách này.

Có ai có thể cho tôi câu trả lời dứt khoát nếu có thể không? Và/hoặc tinh chỉnh cần thiết trong đoạn mã của tôi?

Rất cám ơn.

+0

Tôi đã tự hỏi điều tương tự. "ban đầu" không seam để làm việc với sự lựa chọn trong phiên bản thân cây mới nhất là tốt. –

Trả lời

87

Hãy thử thiết lập các giá trị ban đầu khi bạn nhanh chóng có dạng:

form = MyForm(initial={'max_number': '3'}) 
+0

Có phải '' ''3'''' tương ứng với giá trị đầu tiên của bộ tuple hoặc thứ hai không? – Bestasttung

+1

các bộ đại diện cho các cặp (giá trị, nhãn) cho các tùy chọn và bạn muốn chỉ định giá trị ban đầu - vì vậy '3' là mục đầu tiên. – Tom

1

Để chắc chắn tôi cần xem cách bạn đang hiển thị biểu mẫu. Giá trị ban đầu chỉ được sử dụng ở dạng không liên kết, nếu nó bị ràng buộc và giá trị cho trường đó không được bao gồm thì sẽ không có gì được chọn.

17

Tôi chạy vào vấn đề này là tốt, và đã tìm ra rằng vấn đề là trong trình duyệt. Khi bạn làm mới trình duyệt, hãy điền lại biểu mẫu có cùng giá trị như trước, bỏ qua trường đã chọn. Nếu bạn xem nguồn, bạn sẽ thấy giá trị đã chọn là chính xác. Hoặc đặt con trỏ vào trường URL của trình duyệt và nhấn enter. Điều đó sẽ tải lại biểu mẫu từ đầu.

+1

chỉ fyi, Điều này vẫn xảy ra trong FF6. Nhấn nút làm mới là không đủ. Nhưng trong google chrome làm mới nút là đủ, không cần phải đi đến thanh địa chỉ – mhd

+1

Tôi nghĩ rằng nó sẽ luôn luôn xảy ra trong Firefox; đó là hành vi dự định. – thepeer

3

Dave - có may mắn tìm giải pháp cho vấn đề trình duyệt không? Có cách nào để buộc làm mới không?

Đối với vấn đề ban đầu, hãy thử những điều sau khi khởi tạo có dạng:

def __init__(self, *args, **kwargs): 
    super(MyForm, self).__init__(*args, **kwargs) 
    self.base_fields['MyChoiceField'].initial = initial_value 
+1

Điều này trông không đẹp. Trích dẫn từ django 1.3, forms.py:93: 'Các trường hợp phải luôn thay đổi self.fields; họ không nên sửa đổi self.base_fields.' – SummerBreeze

37

Bạn cũng có thể làm như sau. trong biểu mẫu lớp học của bạn def:

max_number = forms.ChoiceField(widget = forms.Select(), 
       choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,) 

sau đó khi gọi biểu mẫu trong chế độ xem, bạn có thể tự động đặt cả lựa chọn ban đầu và danh sách lựa chọn.

yourFormInstance = YourFormClass() 

yourFormInstance.fields['max_number'].choices = [(1,1),(2,2),(3,3)] 
yourFormInstance.fields['max_number'].initial = [1] 

Lưu ý: giá trị ban đầu phải là danh sách và lựa chọn phải là 2 tuples, trong ví dụ trên tôi có danh sách 2 bộ dữ liệu. Hi vọng điêu nay co ich.

+3

Có lẽ đáng chú ý là giá trị của 'initial' là khóa của mục được chọn, không phải chỉ mục của nó. Đã cho tôi một vài cố gắng để làm việc này ra! – BigglesZX

5

Cả hai câu trả lời của Tom và Burton đều làm việc cho tôi, nhưng tôi gặp một chút rắc rối khi tìm ra cách áp dụng chúng vào ModelChoiceField.

Bí quyết duy nhất để nó là sự lựa chọn được lưu trữ như các tuple của (<model's ID>, <model's unicode repr>), vì vậy nếu bạn muốn thiết lập các lựa chọn mô hình ban đầu, bạn vượt qua của mô hình ID như giá trị ban đầu, không phải là đối tượng chính nó hoặc nó tên hoặc bất cứ điều gì khác.Sau đó, nó đơn giản như:

form = EmployeeForm(initial={'manager': manager_employee_id}) 

Ngoài ra lập luận initial thể bỏ qua ở vị trí của một dòng thêm với:

form.fields['manager'].initial = manager_employee_id 
+1

Dòng mã thứ hai của bạn hoạt động hoàn hảo trong một trong những trường hợp hiếm hoi mà bạn cần phải đặt giá trị ban đầu của biểu mẫu sau một yêu cầu 'GET' và đặt nó từ bên trong một khung nhìn. – kstratis

60

này không chạm vào vấn đề ngay lập tức trong tầm tay, nhưng điều này Q/A xuất hiện cho các tìm kiếm có liên quan đến việc cố gán giá trị đã chọn cho một số ChoiceField.

Nếu bạn đã gọi super().__init__ trong lớp Biểu mẫu, bạn nên cập nhật từ điển form.initial, chứ không phải thuộc tính field.initial. Nếu bạn nghiên cứu form.initial (ví dụ: print self.initial sau khi gọi tới super().__init__), nó sẽ chứa các giá trị cho tất cả các trường. Có giá trị là None trong dict đó sẽ ghi đè giá trị field.initial.

ví dụ:

class MyForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     # assign a (computed, I assume) default value to the choice field 
     self.initial['choices_field_name'] = 'default value' 
     # you should NOT do this: 
     self.fields['choices_field_name'].initial = 'default value' 
+1

Cảm ơn. Như bạn đã nói, nó không chính xác liên quan đến OP nhưng nó giải quyết được vấn đề tôi đã googling cho! – randlet

+0

Cảm ơn vì điều đó, đã cứu tôi khỏi một chút gãi đầu! – TimD

+2

nếu bạn không hiểu câu trả lời này, hãy đọc [django form gotchas] (http://www.avilpage.com/2015/03/django-form-gotchas-dynamic-initial.html) – ChillarAnand

-2

Hãy thử điều này nó làm việc cho tôi, tôi đã thêm này trong models.py

options = (
    ('1','1'), 
    ('2','2'), 
    ('3','3') 
) 

max_number = forms.ChoiceField(max_length = 2, choices = options, default ='3') 
+5

này đưa ra một lỗi trong django 1.8.1: 'TypeError tại/my/url/ __init __() có một cuộc tranh cãi từ khóa bất ngờ 'mặc định' Yêu cầu Phương pháp: \t GET URL yêu cầu: \t http: // localhost: 8000/my/url/ Phiên bản Django: \t 1.8.1 Loại ngoại lệ: \t LoạiError Giá trị ngoại lệ: \t __init __() có đối số từ khóa không mong muốn 'default'' – juliocesar

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