Đặt giá trị đã chọn trên biểu mẫu Django.


106

Đây là khai báo trường trong một biểu mẫu:

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

Tôi muốn đặt giá trị ban đầu là 3và điều này dường như không hoạt động. Tôi đã thử với tham số, dấu ngoặc kép / không dấu ngoặc kép, v.v. nhưng không thay đổi.

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

Tôi đang sử dụng Django 1.0


Tôi đã tự hỏi điều tương tự. "ban đầu" cũng không hoạt động với các lựa chọn trong phiên bản thân cây mới nhất.
Ty.

Câu trả lời:


114

Hãy thử đặt giá trị ban đầu khi bạn khởi tạo biểu mẫu:

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

3
'3'tương ứng với giá trị đầu tiên của tuple hay thứ hai?
Bestasttung

4
các bộ giá trị đạ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' đề cập đến mục đầu tiên.
Tom

95

Điều này không liên quan đến câu hỏi tức thì, nhưng Q / A này xuất hiện cho các tìm kiếm liên quan đến việc cố gắng gán giá trị đã chọn cho a ChoiceField.

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

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'

3
nếu bạn không hiểu câu trả lời này, hãy đọc gotchas biểu mẫu django
ChillarAnav

1
Tôi không chắc có phải vì câu trả lời này quá cũ nên không còn hoạt động hay không, nhưng tôi không thể làm cho giải pháp này hoạt động. Tôi đã thử mọi cách kết hợp ở trên và vẫn không nhận được tình yêu. Tôi đã hỏi lại câu hỏi này ở đây: stackoverflow.com/questions/52191096/… Nếu câu trả lời vẫn như cũ, vui lòng cho tôi biết mã của tôi bị lỗi gì. Cảm ơn bạn!
Lehrian

48

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

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

thì khi gọi biểu mẫu trong dạng xem của bạn, bạn có thể đặt động 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 ý: các giá trị ban đầu phải là một danh sách và các lựa chọn phải là 2 bộ, trong ví dụ của tôi ở trên, tôi có một danh sách 2 bộ. Hi vọng điêu nay co ich.


5
Có lẽ cần lưu ý rằng giá trị của initialđề cập đến 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 lần thử để giải quyết vấn đề này!
BigglesZX

20

Tôi cũng gặp phải vấn đề này và phát hiện ra rằng vấn đề nằm ở trình duyệt. Khi bạn làm mới trình duyệt đang điền lại biểu mẫu với các giá trị giống như trước đây, bỏ qua trường đã chọn. Nếu bạn xem nguồn, bạn sẽ thấy giá trị đã kiểm tra là chính xác. Hoặc đặt con trỏ của bạn 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ỉ là 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 nút refresh là đủ, không cần phải đi đến thanh địa chỉ
mhd

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

Vẫn xảy ra trong Chrome 83, bạn đã cứu mạng tôi!
lapin

7

Cả hai câu trả lời của Tom và Burton cuối cùng đều phù hợp với tôi, nhưng tôi đã gặp một chút khó khăn khi tìm cách áp dụng chúng cho a ModelChoiceField.

Mẹo duy nhất đối với nó là các lựa chọn được lưu trữ dưới dạng các bộ giá trị (<model's ID>, <model's unicode repr>), vì vậy nếu bạn muốn đặt lựa chọn mô hình ban đầu, bạn chuyển ID của mô hình làm giá trị ban đầu, chứ không phải bản thân đối tượng hoặc tên của nó hoặc bất kỳ thứ gì khác. Sau đó, nó đơn giản như:

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

Ngoài ra, initialcó thể bỏ qua đối số thay cho một dòng bổ sung 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 khi bạn cần đặt giá trị ban đầu của biểu mẫu sau một GETyêu cầu và đặt nó từ trong một dạng xem.
kstratis

3

Dave - có may mắn tìm được 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ử các bước sau khi khởi tạo biểu mẫu:

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, form.py:93:Instances should always modify self.fields; they should not modify self.base_fields.
Tomas Tomecek

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ó giá trị nào được chọn.


-4

Hãy thử cái này nó hoạt động cho tôi, tôi đã thêm cái này trong models.py

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

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

6
Đây đưa ra một lỗi trong django 1.8.1: TypeError at /my/url/ __init__() got an unexpected keyword argument 'default' Request Method: GET Request URL: http://localhost:8000/my/url/ Django Version: 1.8.1 Exception Type: TypeError Exception Value: __init__() got an unexpected keyword argument 'default'
Júlio César Soares Espíndola
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.