2016-08-20 1 views
2

장고 관리자의 요청으로 사용자를 얻으려고합니다. 필요한 것은 인라인 양식의 clean() 메소드에서 요청 사용자에게 액세스하는 것입니다. 아래에 설명 된 것과 비슷한 절차를 보통 ModelForm (예 : 인라인 앱이 아님)으로 완료했으며 성공했습니다. 그러나, 인라인으로 나는 많은 문제가있다.Django Admin에서 인라인 형식으로 요청을 전달 하시겠습니까?

class SaleFormset(BaseInlineFormSet): 
    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request') 
     super(SaleFormset, self).__init__(*args, **kwargs) 

    def _construct_form(self, i, **kwargs): 
     kwargs['request'] = self.request 
     super(SaleFormset, self)._construct_form(i, **kwargs) 


class SaleProductItemInlineForm(ModelForm): 
    """ 
    Custom form for the Sale Product Item Inline used by the 
    Sale Admin form. 
    """ 

    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request') 
     super(SaleProductItemInlineForm, self).__init__(*args, **kwargs) 

    class Meta: 
     model = SaleProductItem 
     fields = "__all__" 

을 그리고 admin.py에, 내가 가진 : 내가 가진

class SaleProductItemInline(admin.TabularInline): 
    """ 
    Tabular inline for a SaleProductItem used in the Sale Admin. 
    """ 
    model = models.SaleProductItem 
    form = SaleProductItemInlineForm 
    formset = SaleFormset 

    def get_formset(self, request, obj=None, **kwargs): 
     formset_class = super(SaleProductItemInline, self).get_formset(request, obj, **kwargs) 

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

     return Subset 

그러나 내가 말하는 오류를 받고 있어요을 그 'NoneType' object has no attribute 'media' 때문에이 섹션의 :

@property 
def media(self): 
    # All the forms on a FormSet are the same, so you only need to 
    # interrogate the first form for media. 
    if self.forms: 
     return self.forms[0].media 

답변

1

비슷한 접근 방식이 나를 위해 일했습니다 :

def SaleProductItemInlineFormFactory(request): 
    class SaleProductItemInlineForm(ModelForm): 
     def __init__(self, *args, **kwargs): 
      # here finally you can do something with your request 
      super(SaleProductItemInlineForm, self).__init__(*args, **kwargs) 

     class Meta: 
      model = SaleProductItem 
      fields = "__all__" 
    return SaleProductItemInlineForm 

def SaleProductItemInlineFactory(request): 
    class SaleProductItemInline(admin.TabularInline): 
     model = models.SaleProductItem 
     form = SaleProductItemInlineFormFactory(request) 

    return SaleProductItemInline 

class SaleAdmin(admin.ModelAdmin): 
    inlines =() 

    # such way we send request to main form 
    def get_form(self, request, obj=None, **kwargs): 
     form = super(SaleAdmin, self).get_form(request, obj=obj, **kwargs) 
     form.request = request 
     return form 

    # we define inlines with factory to create Inline class with request inside 
    def change_view(self, request, object_id, form_url='', extra_context=None): 
     self.inlines = (SaleProductItemInlineFactory(request),) 
     return super(SaleAdmin, self).change_view(request, object_id) 

    # we define inlines with factory to create Inline class with request inside 
    def add_view(self, request, form_url='', extra_context=None): 
     self.inlines = (SaleProductItemInlineFactory(request),) 
     return super(SaleAdmin, self).add_view(request) 
+0

()'당신은 확실히 change_view()' – ckot

+0

'에 전달하는'object_id'에 액세스 할 수있을 것'add_view()'해야 'add_view()'를 호출하십시오. 나는 그것을 고쳤다. 감사합니다 –

+0

이것을 달성하기 위해 그런 고약하고 복잡한 작업을 상상할 수 없다 ... –

0

솔루션의 바로 가기는 다음과 같습니다

add_view`에서
class SaleFormset(BaseInlineFormSet): 

    def _construct_form(self, i, **kwargs): 
     form = super(SaleFormset, self)._construct_form(i, **kwargs) 
     form.request = self.request 
     return form 

class SaleProductItemInline(admin.TabularInline): 
    model = models.SaleProductItem 
    form = SaleProductItemInlineForm 
    formset = SaleFormset 

    def get_formset(self, request, obj=None, **kwargs): 
     formset = super(SaleProductItemInline, self).get_formset(request, obj, **kwargs) 
     formset.request = request 
     return formset