2011-09-04 30 views

Trả lời

10

bạn có thể chuyển đối tượng người dùng làm đối số bổ sung trong hàm tạo biểu mẫu.

ví dụ:

f = MyForm(user=request.user) 

và các nhà xây dựng sẽ trông giống như:

class MyForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user',None) 
     super(MyForm, self).__init__(*args, **kwargs) 

và sau đó sử dụng sử dụng dưới các hình thức clean_XX như bạn muốn

+0

Xin lỗi về việc không làm rõ điều này trong câu hỏi ban đầu, nhưng ModelForm của tôi đã được nối với một lớp con ModelAdmin. Làm thế nào tôi có thể gọi constructor tùy chỉnh của ModelForm từ ModelAdmin? – zer0stimulus

+0

để bạn muốn thực hiện điều này trong giao diện quản trị django? Đã không thử điều đó, nhưng tôi đoán bạn có thể thử ghi đè phương thức __call__ của biểu mẫu. ví dụ: http://stackoverflow.com/questions/727928/django-admin-how-to-access-the-request-object-in-admin-py-for-list-display-meth –

7

Lưu ý: nếu bạn đang sử dụng Lớp Dựa xem (CBVs) sau đó chuyển một đối số thừa vào hàm tạo (ví dụ: trong get_forms_class) hoặc trong form_class sẽ không hoạt động, vì <form> object is not callable sẽ được hiển thị.

Giải pháp cho CBVs là sử dụng get_form_kwargs, ví dụ:

views.py:

# Sending user object to the form, to verify which fields to display/remove (depending on group) 
def get_form_kwargs(self): 
    kwargs = super(MyView, self).get_form_kwargs() 
    kwargs.update({'user': self.request.user}) 
    return kwargs 

forms.py:

class MyForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user') # To get request.user. Do not use kwargs.pop('user', None) due to potential security hole 

     super(MyForm, self).__init__(*args, **kwargs) 

     # If the user does not belong to a certain group, remove the field 
     if not self.user.groups.filter(name__iexact='mygroup').exists(): 
      del self.fields['confidential'] 
Các vấn đề liên quan