2010-04-21 26 views
10

Câu hỏi của tôi rất giống với trang này: How do I access the request object or any other variable in a form's clean() method?Django: Truy cập yêu cầu đối tượng từ form.clean của admin()

Trừ, tôi có cùng một vấn đề với hình thức quản trị. Vì vậy, tôi không thể nhìn thấy một cách để tự khởi tạo biểu mẫu - để chuyển yêu cầu tới nó.

Cảm ơn trước.

+0

Django đối với bạn, quá. –

+0

@Adam - Xin lỗi ?? – Wiseman

Trả lời

31

Thật vậy, có cách để giải quyết vấn đề của bạn!

Bạn sẽ cần phải được cung cấp bởi subclass formModelAdmin.get_form() và ghi đè lên nó:

class BusinessDocumentCommentForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) 
     # Voila, now you can access request anywhere in your form methods by using self.request! 
     super(BusinessDocumentCommentForm, self).__init__(*args, **kwargs) 
     if self.request.GET.get('document_pk', False): 
      #Do something 
    def clean(self): 
     # Do something with self.request 
     # etc.  
    class Meta: 
     model = BusinessDocumentComment 

class BusinessDocumentCommentAdmin(admin.ModelAdmin): 

    form = BusinessDocumentCommentForm  

    def get_form(self, request, obj=None, **kwargs): 

     AdminForm = super(BusinessDocumentCommentAdmin, self).get_form(request, obj, **kwargs) 

     class AdminFormWithRequest(AdminForm): 
      def __new__(cls, *args, **kwargs): 
       kwargs['request'] = request 
       return AdminForm(*args, **kwargs) 

     return AdminFormWithRequest 
+0

Đây là một cách tuyệt vời để giải quyết vấn đề này! Tuy nhiên, tôi hơi bối rối về việc bạn sử dụng thuật ngữ 'MetaClass' ở đây. Như tôi thấy, ModelFormMetaClass chỉ là một siêu lớp của biểu mẫu của bạn. Tôi đang thiếu gì ở đây? – mkoistinen

+1

@mkoistinen, bạn hoàn toàn đúng. Suy nghĩ này đã xảy ra với tôi một thời gian trong quá khứ, nhưng tôi đã quá lười biếng để sửa câu trả lời. Vì mọi người vẫn đang sử dụng đoạn mã, tôi có trách nhiệm sửa nó. Cảm ơn phản hồi. :-) –

+0

Cảm ơn bạn đã cập nhật và tôi đã nhầm khi nhận xét ở trên. Một * phân lớp * của nó. Rất tiếc! – mkoistinen

0

Có một số móc trong lớp ModelAdmin để cho phép bạn thực hiện những việc này - xem mã trong django.contrib.admin.options.

Hai phương pháp có thể giúp bạn là ModelAdmin.save_formModelAdmin.save_model, cả hai phương pháp đều được chuyển đối tượng yêu cầu. Vì vậy, bạn có thể ghi đè lên các phương thức này trong lớp con Quản trị viên của mình và thực hiện bất kỳ xử lý bổ sung nào bạn cần.

Chỉnh sửa sau khi bình luận

Bạn đang hoàn toàn đúng rằng điều này sẽ không cho phép bạn xác nhận các hình thức phụ thuộc vào đặc quyền của người dùng. Rất tiếc, biểu mẫu khởi tạo được chôn sâu bên trong các phương thức add_viewchange_view của ModelAdmin.

Không có nhiều khả năng mà không sao chép nhiều mã hiện có. Bạn có thể ghi đè các phương thức *_view; hoặc bạn có thể thử và ghi đè hàm modelform_factory để trả về một lớp mới với đối tượng yêu cầu đã được nướng; hoặc bạn có thể thử sử dụng phương thức lớp __new__ để làm điều tương tự, nhưng điều đó phức tạp vì hình thức metaclass.

+0

Daniel, cảm ơn câu trả lời của bạn! Trên thực tế, tôi đã cố gắng ghi đè các phương pháp này, thực hiện các biểu mẫu ... Nhưng - chúng tôi đã hiểu (từ một trong các câu trả lời của bạn, nếu tôi không nhầm) không có cách nào để thực hiện xác nhận từ các phương pháp này. Bằng cách "xác nhận", tôi có nghĩa là khả năng không lưu một số nội dung nếu tôi không thích điều gì đó và đồng thời có khả năng cung cấp một số phản hồi có giá trị. Nhiệm vụ của tôi là - xác thực đầu vào quản trị tùy thuộc vào quyền của người dùng. Có thể tôi đang đào ở một nơi sai? – Wiseman

+0

Xem câu trả lời mở rộng của tôi ở trên. –

+0

Rất cám ơn một lần nữa, vì một loạt các cần câu :). – Wiseman

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