2009-02-18 35 views
10

tôi cần phải tạo ra một formset inline màInline formset trong Django - loại bỏ một số lĩnh vực

a) không bao gồm một số lĩnh vực từ MyModel được hiển thị hoàn toàn

b) sẽ hiển thị một số một số lĩnh vực MyModel nhưng ngăn cản họ là có thể chỉnh sửa .

Tôi đã thử sử dụng mã bên dưới, sử dụng values() để lọc truy vấn được đặt thành chỉ những giá trị tôi muốn được trả lại. Tuy nhiên, điều này không thành công.

Bất kỳ ai có ý tưởng nào?

class PointTransactionFormset(BaseInlineFormSet): 
    def get_queryset(self): 
     qs = super(PointTransactionFormset, self).get_queryset() 
     qs = qs.filter(description="promotion feedback") 
     qs = qs.values('description','points_type') # this does not work 
     return qs 

class PointTransactionInline(admin.TabularInline): 
    model = PointTransaction 
    #formset = points_formset() 
    #formset = inlineformset_factory(UserProfile,PointTransaction) 
    formset = PointTransactionFormset 

Trả lời

6

Đây có phải là bộ định dạng để sử dụng trong quản trị viên không? Nếu có, chỉ cần đặt "exclude = ['field1', 'field2']" vào trường InlineModelAdmin của bạn để loại trừ trường. Để hiển thị một số giá trị trường không thể chỉnh sửa, bạn sẽ phải tạo một widget tùy chỉnh đơn giản có phương thức render() trả về giá trị và sau đó ghi đè phương thức formfield_for_dbfield() để gán widget của bạn cho các trường thích hợp. Nếu đây không phải là dành cho quản trị viên, nhưng một bộ định dạng để sử dụng ở nơi khác, thì bạn nên thực hiện các tùy chỉnh ở trên (loại trừ thuộc tính trong lớp bên trong Meta, ghi đè tiện ích trong phương thức __init__) trong lớp con ModelForm mà bạn chuyển đến constructor formset. (Nếu bạn đang sử dụng Django 1.2 hoặc mới hơn, bạn chỉ có thể sử dụng readonly_fields thay thế).

Tôi có thể cập nhật các ví dụ mã nếu bạn làm rõ tình huống bạn đang ở (quản trị viên hay không).

2

Tôi chỉ có một vấn đề tương tự (không phải cho admin - cho các trang web người dùng phải đối mặt) và phát hiện ra bạn có thể vượt qua formset và các lĩnh vực mà bạn muốn hiển thị vào inlineformset_factory như thế này:

factory = inlineformset_factory(UserProfile, PointTransaction, 
       formset=PointTransactionFormset, 
       fields=('description','points_type')) 
formset = factory(instance=user_profile, data=request.POST) 

nơi user_profile là một UserProfile.

Được cảnh báo rằng điều này có thể gây ra sự cố xác thực nếu mô hình cơ bản yêu cầu các trường không có trong danh sách trường được chuyển thành inlineformset_factory, nhưng đó là trường hợp đối với bất kỳ loại biểu mẫu nào.

12

Một điều dường như không được nói trong tài liệu là bạn có thể bao gồm một biểu mẫu bên trong các tham số của bạn cho các biểu mẫu của mô hình. Vì vậy, ví dụ, giả sử bạn có một ModelForm người, bạn có thể sử dụng nó trong một mô hình formset bằng cách làm này

PersonFormSet = inlineformset_factory(User, Person, form=PersonForm, extra=6) 

này cho phép bạn làm tất cả những hình thức xác nhận, không bao gồm, vv về mặt kĩ ModelForm và có nhà máy tái tạo nó.

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