2013-03-27 7 views
0

Я создаю приложение для проверки/проверки для инвентаря. Пользователям не нужен пароль или адрес электронной почты, и им нужно только ввести номер или сканировать карту со своим штрих-кодом. Поэтому вместо использования модели 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', 
) 
+0

https://github.com/django/django/blob/master/django/contrib/auth/decorators.py#L44 – dm03514

+0

Что еще вы украсили 'is_user_authed'? Моя ставка заключается в том, что у вас есть этот декоратор на 'check_in_out_item'. Я не вижу другой причины, чтобы ваш столбец возвращался обратно к декоратору из представления. –

+0

Умм. Выглядит странно. Вы уверены, что у вас есть 'django.contrib.sessions.middleware.SessionMiddleware' в списке MIDDLEWARE_CLASSES в settings.py? – MostafaR

ответ

1

Как указано в комментариях, проблема заключается в том, что check_in_out_item ожидает Request, так как вы украсили, но вы передаете его user, который является Member. Вам необходимо изменить check_in_out_item, чтобы принять Request вместо Member или удалить декоратор.

Смежные вопросы