django brookie - объект «NoneType» не имеет атрибута «статус»

На днях наткнулся на приложение Brookie и осмотрелся. Очень удобно создавать PDF-файлы счетов при сохранении.

Однако я получаю эту ошибку при создании нового счета. Я знаю, что ошибка возникает из-за того, что объекта нет и поэтому у него не может быть атрибута.

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)

Я пробовал различные способы проверить существование объекта перед полями только для чтения. Поля только для чтения возвращаются, если счет-фактура находится в состоянии, отличном от «в разработке» (1)

Как я могу игнорировать функцию get_readonly_fields, если объект новый? Я также пытался добавить в модель значение по умолчанию = 1, проверяя наличие объекта, прежде чем безуспешно пытаться получить доступ к атрибуту состояния.

заранее спасибо

## РЕДАКТИРОВАТЬ ##

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'

person Timbadu    schedule 21.01.2011    source источник
comment
Где возникает ошибка? Всегда полезно предоставить полную трассировку (сначала используйте «переключиться на режим копирования и вставки»).   -  person Daniel Roseman    schedule 21.01.2011


Ответы (1)


Проблема в том, что вы пытаетесь оценить атрибут status даже в том случае, когда obj равно None, что, по-видимому, является приемлемым случаем.

Чтобы исправить это, вы можете изменить это:

# 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')
person Kyle Wild    schedule 21.01.2011
comment
Спасибо, я пытался if obj: if obj.status: не работал. Это помогло - person Timbadu; 19.02.2011