2011-03-17 93 views
0

我正在研究具有三個「配置文件」模型類型的應用程序。這些模型中的每一個都有contrib.auth.models用戶模型的外鍵。從auth.models.User獲取相關模型類

我想每個模型類型都有單點登錄,並通過classmethod提供重定向,具體取決於哪個「模型」模型類型與登錄用戶相關。

下面是一些僞代碼來說明我想做些什麼:

from django.contrib.auth import authenticate, login 
from django.http import HttpResponse, HttpresponseRedirect 

from lib.forms import Loginform #extends the built-in AuthenticationForm 

def login_user(request): 
    if request.method == 'POST': 
     form = LoginForm(data=request.POST) 
     if form.is_valid(): 
      cleaned_data = form.cleaned_data 
      user = authenticate(username=cleaned_data.get('username'), \ 
       password=cleaned_data.get('password')) 
      if user: 
       login(request, user) 

       #Determine the content type of the model related to the user 
       #get the correct redirect value from an @classmethod 
       #called: after_login_redirect for that type and... 

       return HttpResponseRedirect(klass.after_login_redirect()) 
     else: 
      response = form.errors_as_json() 
      return HttpResponse(json.dumps(response, ensure_ascii=False), \ 
       mimetype='application/json') 

是否可以充分利用CONTENTTYPES框架來做到這一點?或者我最好只寫一個循環遍歷「配置」類的數組的類解析器?我沒有看到我可以通過User類的ContentTypes來做到這一點,除非有人知道解決方法。

由於提前, 布蘭登

+0

我發現這篇文章:http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/我敢去看看我能否修改以適應我的需求。 – Brandon 2011-03-17 21:48:53

回答

1

[解決]
所以,我落得這樣做創建UserContentType個路口的模式,看起來像這樣:

from django.contrib.auth.models import User 
from django.contrib.contenttypes.models import ContentType 

class UserContentType(models.Model): 
    user = models.ForeignKey(User) 
    content_type = models.ForeignKey(ContentType) 

於是,我做了一個預先保存的信號來觸發get或創建,如果三個「配置文件」模型之一的實例我沒有一個id:

from django.contrib.contenttypes.models import ContentType 

from lib.models import UserContentType 

def set_content_type_for_user(sender, **kwargs): 
    instance = kwargs.get('instance') 
    content_type = ContentType.objects.get_for_model(instance) 
    user = instance.user 
    if not instance.id: 
     user_content_type, \ 
      created = UserContentType.objects.get_or_create(user=user, \ 
      content_type=content_type, \ 
      defaults={'user' : user, 'content_type' : content_type}) 

然後,在通過ajax發佈的自定義登錄視圖中,我可以獲取與該User實例關聯的內容類型,並從該內容類型的'after_login_redirect()'類方法獲取重定向到的URL。 :)

def login_user(request): 
    if request.method == 'POST': 
     form = LoginForm(data=request.POST) 
     if form.is_valid(): 
      cleaned_data = form.cleaned_data 
      user = authenticate(username=cleaned_data.get('username', ''), 
           password=cleaned_data.get('password', '')) 
      if user: 
       login(request, user) 
       user_content_type = UserContentType.objects.get(user=user) 
       redirect_path = 
        user_content_type.content_type.\ 
        model_class().after_login_redirect_path() 
       response = {'redirect_path' : redirect_path} 
     else: 
      response = form.errors_as_json() 
     return HttpResponse(json.dumps(response, \ 
      ensure_ascii=False), mimetype='application/json') 

這樣,我不必monkeypatch用戶。我希望這能幫助別人。如果有辦法我可以改進這一點,我很樂意聽到一些想法。

感謝, 布蘭登