2013-04-17 4 views
0

내 django 앱에 사용자 위시리스트 기능이 있습니다. 나는 익명 사용자가 그의 위시리스트에 제품을 추가 할 수 있기를 원한다.세션을 사용하여 익명 사용자의 데이터를 저장

models.py 

class User_Wishlist(models.Model): 
    created_by = models.ForeignKey(User, default=None, null =True, blank=True) 
    products = models.ManyToManyField(Products, null=True) 


# some Products model 

views.py 
# to add an item from the user wishlist 

def add_userwl(request, id): 
    products = Products.objects.filter(id__iexact=id) 
    product = products[0] 
    if request.user.is_authenticated(): 
     userwlt = get_sl(request, request.user) #gets the auth user wishlist 
     userwlt.products.add(product) 
     sl_products = userwlt.products.all() 
    else: 
     if "wl_user" in request.session: 
      wl_user = request.session["wl_user"] 
     else: 
      wl_user = User_Wishlist(created_by = request.user) #here lies the problem! 
      request.session["wl_user"] = wl_user 

     wl_user.products.add(product) 
     wl_products = wl_user.products.all() 

    return render_to_response('getsl.html', { 
     'wl_products':wl_products 
    }, context_instance=RequestContext(request)) 

오류 : "할당 할 수 없음": "User_Wishlist.created_by"는 "사용자"인스턴스 여야합니다.

따라서 anon 사용자의 위시리스트를 만들 수 없습니다. 또한 wl_user = User_Wishlist()를 수행하면 사용자 ID를 지정하지 않고 manytomany 필드 'products'에 액세스 할 수 없습니다.

위의 사항에 대한 도움이 될 것입니다. 감사!

p.s : 나는 또한 익명의 사용자가 로그인 한 번이 사용자의 위시리스트를 저장하기를 원하지만 그게 나중에 문제

답변

2

에게 익명 사용자의 사용자 개념은 잘못된 것 같다. 특정 '사용자'에게 데이터를 바인딩하려면 해당 사용자를 위해 '사용자'를 만들어야합니다. 그렇지 않으면 세션이 만료되거나 '사용자'가 브라우저의 캐시를 재설정 할 때마다 데이터가 사라집니다.

'사용자'가 정의되는 방식은 전적으로 귀하에게 달려 있습니다. 그것은 '장바구니'또는 '고객'또는 다른 어떤 것일 수 있습니다. Django의 인증 모듈이 제공 한 것과 다른 추상화를 사용할 수있는 이유가 없습니다.

이 기능을 제대로 구현하는 대부분의 사이트에서는 그리 많지 않은 '익명'세션을 선택적 계정 (oauth 또는 openid 솔루션 일 수도 있음)에 바인딩 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다! 그래서 나는 user = User (username = request.session.session_key)라는 사용자를 만들었습니다. session_key를 username 또는 id로 사용하는 것이 적절한 지 알지 못합니다. 잘 작동합니다! 어떻게 사용자 개체를 만들 수 있습니까? 나중에 사용자가 등록 할 때이 데이터를 저장해야한다는 것을 명심하십시오. –

0

훨씬 간단한 해결책은 wishlis가 사용자 개체 또는 세션 개체 인에 연결되도록 요구하는 것입니다. 따라서 해당 필드가 null이고 사용자 객체를 선호하는 로직을 구현할 수 있습니다.