2009-09-30 27 views
7

Tôi có những gì tôi nghĩ là một vấn đề đơn giản. Tôi có một formset mô hình nội tuyến, và tôi muốn tạo một trường chọn có giá trị được chọn mặc định của người dùng hiện đang đăng nhập. Theo quan điểm, tôi đang sử dụng phần mềm trung gian xác thực của Django, vì vậy việc người dùng là một vấn đề đơn giản khi truy cập request.user.Django: Làm thế nào để thiết lập giá trị ban đầu cho một trường trong một bộ mẫu mô hình nội tuyến?

Điều tôi chưa thể tìm ra, là cách đặt người dùng đó làm giá trị được chọn mặc định trong hộp chọn (ModelChoiceField) chứa danh sách người dùng. Bất cứ ai có thể giúp tôi với điều này?

Trả lời

4

Tôi không chắc chắn làm thế nào để xử lý này trong formsets inline, nhưng phương pháp sau đây sẽ làm việc cho hình thức bình thường và ModelForms:

Bạn không thể đặt này như là một phần của định nghĩa mô hình, nhưng bạn có thể thiết lập trong quá trình khởi tạo biểu mẫu:

def __init__(self, logged_in_user, *args, **kwargs): 
    super(self.__class__, self).__init__(*args, **kwargs) 
    self.fields['my_user_field'].initial = logged_in_user 

... 

form = MyForm(request.user) 
+0

Không chắc chắn cách thức này sẽ hoạt động với bộ định tuyến nội tuyến. Tôi đang sử dụng inlineformset_factory để tạo formset của tôi và chuyển nó qua lớp biểu mẫu, không phải là một cá thể. Vì vậy, tôi không trực tiếp instantiating một đối tượng hình thức bất cứ nơi nào và không biết làm thế nào tôi vượt qua nó mà tham số constructor. – Jeff

+0

Hmmm ... Tôi tin rằng ModelForms sẽ có giá trị 'mặc định', đúng không? Và các trường biểu mẫu chuẩn sử dụng ban đầu khi bạn hiển thị, nhưng theo như tôi biết không có lý do gì để đi siêu() trên đó. – monkut

+0

Điều này thật tuyệt! Tôi đang tìm cách gửi dữ liệu từ biểu mẫu đến chế độ xem để tôi có thể gửi trạng thái sẽ được hiển thị bằng khung thư. Trong biểu mẫu tôi đã sử dụng từ khóa ban đầu, và sau đó trong chế độ xem tôi đã thực hiện việc này trên xác thực: cur_key_status = form.cleaned_data ['key_status'] messages.success (request, cur_key_status) – radtek

4

Điều này thực hiện thủ thuật. Nó hoạt động bằng cách thiết lập các giá trị ban đầu của tất cả các biểu mẫu "phụ".

formset = MyFormset(instance=myinstance) 
user = request.user 
for form in formset.forms: 
    if 'user' not in form.initial: 
     form.initial['user'] = user.pk 
0

Tôi đang sử dụng ý tưởng Rune Kaagaard của trên, ngoại trừ tôi nhận thấy rằng formsets cung cấp một tài sản extra_forms: django.forms.formsets code

@property 
def extra_forms(self): 
    """Return a list of all the extra forms in this formset.""" 
    return self.forms[self.initial_form_count():] 

Vì vậy, gắn bó với ví dụ trên:

formset = MyFormset(instance=myinstance) 
user = request.user 
for form in formset.extra_forms: 
    form.initial['user'] = user.pk 

Tiết kiệm phải kiểm tra bất kỳ biểu mẫu ban đầu nào, chỉ cần cung cấp mặc định cho các biểu mẫu bổ sung.

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