2011-01-21 25 views
0

先日Brooklyアプリにぶつかり、周りを見回しました。保存時に請求書PDFを作成するのに非常に便利です。django brookie - 'NoneType'オブジェクトに属性 'status'がありません

ただし、新しい請求書の作成時にこのエラーが発生します。私は、オブジェクトが存在せず、したがって属性を持つことができないので、エラーが発生することを知っています。

class InvoiceAdmin(admin.ModelAdmin): 
    list_display = ('client', 'status', 'date', total_monetized, is_expired, pdf_invoice) 
    list_filter = ('status', 'client') 
    exclude = ('invoice_no',) 
    ordering = ('id',) 
    search_fields = ['client__company', ] 
    readonly_fields =() 
    inlines = [ItemInline,] 

class Media: 
    js = ('http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js', 'brookie/js/brookie.js') 

def get_readonly_fields(self, request, obj=None): 
    readonly = super(InvoiceAdmin, self).get_readonly_fields(request, obj) 

    # if the invoice is send you can no longer alter it 
    if obj.status in br_settings.INVOICE_FINISH_STATUS: 
     readonly = ('invoice_id', 'client', 'date', 'currency', 'tax', 'hourly_rate') 

    return readonly 

def save_model(self, request, obj, form, change): 
    obj.save() 
    if obj.status in br_settings.INVOICE_FINISH_STATUS: 
     # Set the invoice id 
     if not obj.invoice_no: 
      invoice_list = Invoice.objects.filter(invoice_no__isnull=False).order_by('-invoice_no') 
      try: 
       invoice = invoice_list[0] 
      except: 
       # There are no numbered invoices 
       invoice_no = getattr(br_settings, 'INVOICE_START_NUMBER', 1) 
      else: 
       invoice_no = invoice.invoice_no + 1 
      obj.invoice_no = invoice_no 
      obj.save() 

     # Generate the pdf for this invoice 
     context_dict = {'invoice': obj, 
         'client': obj.client, 
         'items': obj.items.all(),} 

     generate_pdf(obj.invoice_id, context_dict, "brookie/invoice_%s_pdf.html" % obj.currency, save=True) 

私は、読み取り専用フィールドの前にオブジェクトの存在をテストするさまざまな方法を試みました。請求書がindevelopment(1)以外の状態にある場合は、読み取り専用フィールドが返されます。

オブジェクトが新しい場合、get_readonly_fields関数を無視するにはどうすればよいですか? 私はまた、モデルにデフォルト= 1を追加しようとしましたが、ステータスアトリビュートにアクセスする前にobjの存在をテストしていません。事前

おかげ【EDIT】

Traceback: 
File "C:\Python26\lib\site-packages\django\core\handlers\base.py" in get_response 
    100.      response = callback(request, *callback_args, **callback_kwargs) 
File "C:\Python26\lib\site-packages\django\contrib\admin\options.py" in wrapper 
    239.     return self.admin_site.admin_view(view)(*args, **kwargs) 
File "C:\Python26\lib\site-packages\django\utils\decorators.py" in _wrapped_view 
    76.      response = view_func(request, *args, **kwargs) 
File "C:\Python26\lib\site-packages\django\views\decorators\cache.py" in _wrapped_view_func 
    69.   response = view_func(request, *args, **kwargs) 
File "C:\Python26\lib\site-packages\django\contrib\admin\sites.py" in inner 
    190.    return view(request, *args, **kwargs) 
File "C:\Python26\lib\site-packages\django\utils\decorators.py" in _wrapper 
    21.    return decorator(bound_func)(*args, **kwargs) 
File "C:\Python26\lib\site-packages\django\utils\decorators.py" in _wrapped_view 
    76.      response = view_func(request, *args, **kwargs) 
File "C:\Python26\lib\site-packages\django\utils\decorators.py" in bound_func 
    17.     return func(self, *args2, **kwargs2) 
File "C:\Python26\lib\site-packages\django\db\transaction.py" in _commit_on_success 
    299.      res = func(*args, **kw) 
File "C:\Python26\lib\site-packages\django\contrib\admin\options.py" in add_view 
    773.   ModelForm = self.get_form(request) 
File "C:\Python26\lib\site-packages\django\contrib\admin\options.py" in get_form 
    356.   exclude.extend(self.get_readonly_fields(request, obj)) 
File "C:\Sites\media\bread-and-pepper-django-brookie-a1a8102\brookie\admin.py" in get_readonly_fields 
    124.   if obj.status in br_settings.INVOICE_FINISH_STATUS: 

Exception Type: AttributeError at /admin/brookie/invoice/add/ 
Exception Value: 'NoneType' object has no attribute 'status' 
+0

を?完全なトレースバックを与えることは常に役立ちます(最初にコピー&ペーストビューに切り替えて使用してください)。 –

答えて

1

問題は、明らかに許容されている、でもobjNoneである場合にはstatus属性を評価しようとしているということです場合。それを修正する

、あなたは、この変更ができます。これに

# if the invoice is send you can no longer alter it 
if obj.status in br_settings.INVOICE_FINISH_STATUS: 
    readonly = ('invoice_id', 'client', 'date', 'currency', 'tax', 'hourly_rate') 

:エラーが発生している

# if the invoice is send you can no longer alter it 
if obj and obj.status in br_settings.INVOICE_FINISH_STATUS: 
    readonly = ('invoice_id', 'client', 'date', 'currency', 'tax', 'hourly_rate') 
+0

ありがとう、私は 場合obj: 場合obj.status: は動作していませんでした。これはトリックでした – Timbadu

関連する問題