2011-01-21 64 views
0

有一天碰到了Brookie應用程序,並環顧四周。非常好的創建發票PDF的保存。django brookie - 'NoneType'對象沒有任何屬性'狀態'

但是,在創建新發票時出現此錯誤。我知道錯誤的出現是因爲沒有對象,因此它不能有屬性。

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) 

我試過各種方法來測試readonly字段之前對象的存在。如果發票處於其他狀態,則返回只讀字段(1)

如果對象是新的,我該如何忽略get_readonly_fields函數? 我也嘗試在模型中添加一個默認= 1,在嘗試訪問狀態attibute之前測試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

哪裏發生錯誤?給予完整的回溯總是有幫助的(首先使用「切換到複製和粘貼視圖」)。 – 2011-01-21 15:30:11

回答

1

的問題是,你想,即使在情況評估status屬性,其中objNone,這顯然是一個可以接受案件。

要解決它,你可以改變這一點:

# 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 2011-02-18 21:11:08