2011-03-16 40 views
48

Tôi có một lớp được định nghĩa Django Mẫu thích này trong Models:Django ModelChoiceField: lọc truy vấn thiết lập và thiết lập giá trị mặc định như một đối tượng

class AccountDetailsForm(forms.Form): 
    ... 
    adminuser = forms.ModelChoiceField(queryset=User.objects.all()) 

này hoạt động OK, nhưng nó có một số hạn chế tôi dường như không thể làm việc xung quanh:

(1) tôi muốn sử dụng một bộ lọc trên queryset, dựa trên một biến accountid truyền cho các hình thức, như thế này:

User.objects.filter(account=accountid) 

Điều này không thể làm việc trong mô hình bởi vì tất nhiên, không thể chuyển đổi accountid thành biến.

Sau đó, queryset phải bằng cách nào đó được xác định trong Views, nhưng theo như tôi có thể thấy đó là trường bắt buộc trong lớp Biểu mẫu.

(2) Tôi muốn thực hiện các lựa chọn mặc định của AccountDetailsForm một đối tượng trong cơ sở dữ liệu, mà tôi có thể lựa chọn trong Views như thế này:

User.objects.filter(account=accountid).filter(primary_user=1) 

tôi đã cố gắng xác định adminuser như một mặc định giá trị trong biểu mẫu, (hoạt động với các trường biểu mẫu chuẩn khác, như CharField):

adminuser = User.objects.filter(account=accountid).filter(primary_user=1) 

... 

form = AccountDetailsForm({'adminuser': adminuser}) 
return render_to_response('accounts/edit/accountdetails.html', 
{'form': form, 'account':account}) 

Nhưng không may mắn.

Tôi có nên sử dụng thứ gì đó khác ngoài ModelChoiceField vì tính linh hoạt tôi cần ở đây không?

Cảm ơn.

Trả lời

91

Ghi đè phương thức init và chấp nhận một đối số từ khóa mới

class AccountDetailsForm(forms.Form): 
    ... 
    adminuser = forms.ModelChoiceField(queryset=User.objects.all()) 
    def __init__(self, *args, **kwargs): 
     accountid = kwargs.pop('accountid', None) 
     super(AccountDetailsForm, self).__init__(*args, **kwargs) 

     if accountid: 
      self.fields['adminuser'].queryset = User.objects.filter(account=accountid) 

form = AccountDetailsForm(accountid=3) 

Bạn có thể luôn luôn chỉ cần thiết lập các lựa chọn bằng tay trong giao diện là tốt.

form = AccountDetailsForm() 
form.fields['adminuser'].queryset = User.objects.filter(account=accountid) 

Được cảnh báo: bạn là không giá trị thiết lập mặc định bằng cách thông qua trong một từ điển để một hình thức giống như trong ví dụ của bạn.

Bạn đang thực sự tạo Biểu mẫu ràng buộc, có khả năng kích hoạt xác thực và tất cả nhạc jazz đó.

Để thiết lập giá trị mặc định, use the initials argument.

form = AccountDetailsForm(initial={'adminuser':'3'}) 
+0

Hi, nhờ trả lời của bạn. Đặt bộ truy vấn trong chế độ xem hoạt động tốt. Phần tôi không thể làm việc là thiết lập giá trị biểu mẫu bị ràng buộc (thay vì mặc định) của ModelChoiceField là _User.objects.filter (account = accountid) .filter (primary_user = 1) _. Cảm ơn. – eli

6

Bạn có thể ghi đè lên lĩnh vực này trong giao diện

yourForm = AccountDetailsForm() 

yourForm.fields['accomodation'] = forms.ModelChoiceField(User.objects.filter(account=accountid).filter(primary_user=1)) 
Các vấn đề liên quan