Я создаю приложение для проверки/проверки для инвентаря. Пользователям не нужен пароль или адрес электронной почты, и им нужно только ввести номер или сканировать карту со своим штрих-кодом. Поэтому вместо использования модели auth/users я использую свой собственный метод: Members
. Eveything работает отлично, я могу войти/выйти из системы, но проблема начинается, когда я пытаюсь проверить элемент. Затем я получаю ошибку Member object has no attribute 'session'
объект не имеет сеанса атрибута
Как устранить эту ошибку?
ОШИБКА
[27/Mar/2013 12:16:30] ERROR [django.request:215] Internal Server Error: /checkout/
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py", line 111, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "/Users/username/Google Drive/Python/GearTracker/GearTracker/decorators.py", line 15, in wrapper
return function(request, *args, **kw)
File "/Users/username/Google Drive/Python/GearTracker/inventory/views.py", line 28, in checkout
check_status = check_in_out_item(request.session.get('user'),checked_out_item)
File "/Users/username/Google Drive/Python/GearTracker/GearTracker/decorators.py", line 12, in wrapper
if not (request.session.get('is_authed') == True):
AttributeError: 'Member' object has no attribute 'session'
decorators.py
def is_user_authed(function):
def wrapper(request, *args, **kw):
logger.info(request)
if not (request.session.get('is_authed') == True):
return HttpResponseRedirect('/login/')
else:
return function(request, *args, **kw)
return wrapper
инвентарь/views.py фрагмент кода
@is_user_authed
def checkout(request):
form = CheckoutForm(request.POST or None)
logger.info(request)
if request.method == 'POST':
if (request.POST.get('serial')):
try:
checked_out_item = Inventory.objects.get(serial=request.POST.get('serial'))
check_status = check_in_out_item(request.session.get('user'),checked_out_item)
except Inventory.DoesNotExist:
pass
elif (request.POST.get('barcode')):
try:
checked_out_item = Inventory.objects.get(barcode=request.POST.get('barcode'))
check_status = check_in_out_item(request.session.get('user'),checked_out_item)
except Inventory.DoesNotExist:
pass
checked_out_items = Checkout.objects.all().filter(user=request.session.get('user'),checked_in__isnull=True)
return render(request, 'inventory/index.html', {'items': checked_out_items, 'form': form})
модели инвентаризации
class Group(models.Model):
name = models.CharField(max_length=200)
def __unicode__(self):
return self.name
class Member(models.Model):
name = models.CharField(max_length=200)
p_number = models.BigIntegerField()
barcode = models.CharField(max_length=50,blank=True)
def __unicode__(self):
return self.name
class Inventory(models.Model):
name = models.CharField(max_length=200)
serial = models.CharField(max_length=200)
barcode = models.CharField(max_length=200)
active = models.BooleanField(verbose_name="Active (can be checked out if not out for repair)",blank=True,default=True)
repair = models.BooleanField(verbose_name="Out for repair?",blank=True)
group = models.ForeignKey(Group)
def __unicode__(self):
return self.name
class Checkout(models.Model):
user = models.ForeignKey(Member)
item = models.ForeignKey(Inventory)
checked_out = models.DateTimeField()
checked_in = models.DateTimeField(null=True, blank=True)
def __unicode__(self):
return self.item.name
MiddleWare
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
# Uncomment the next line for simple clickjacking protection:
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
https://github.com/django/django/blob/master/django/contrib/auth/decorators.py#L44 – dm03514
Что еще вы украсили 'is_user_authed'? Моя ставка заключается в том, что у вас есть этот декоратор на 'check_in_out_item'. Я не вижу другой причины, чтобы ваш столбец возвращался обратно к декоратору из представления. –
Умм. Выглядит странно. Вы уверены, что у вас есть 'django.contrib.sessions.middleware.SessionMiddleware' в списке MIDDLEWARE_CLASSES в settings.py? – MostafaR