2013-07-23 35 views
0

我有這樣的ModelForm:我該如何強制ModelForm使用特定的數據庫?

class ClienteForm(ModelForm): 
    class Meta: 
    model = Pessoa 

    def __init__(self, *args, **kwargs): 
    vUserProfile = kwargs.pop('vUserProfile', None) 
    super(ClienteForm, self).__init__(*args, **kwargs) 

如何可以強制使用特定的數據庫?

我不能用分貝路由器,因爲「特定的」數據庫在我的用戶配置文件的設置,我不知道如何在DB-類路由器獲得用戶配置..

我知道我可以在ClienteForm.save中使用(使用= XXX),但是當我嘗試ClienteForm.is_valid時,我得到錯誤,因爲django嘗試使用「默認」數據庫。

感謝

+0

我回答其他題目,差不多是這樣: http://stackoverflow.com/questions/17797419/modelforms-and-multiple-datasbase-error-in-form-is-valid/18020774#18020774 –

回答

0

回覆我的問題......

得到這個問題的唯一方法是讓一箇中間件獲取數據庫名稱和與當地人合作,是這樣的:

文件:中間件的.py

from threading import local 
from django.contrib.sessions.models import Session 
from django.contrib.auth.models import User 
from web_core.models import UserProfile 

my_local_global = local() 


class CustomerMiddleware(object): 
    def process_request(self, request): 
     my_local_global.database_name = get_database_name(request) 


def get_database_name(request): 
    session_key = request.session.session_key 
    try: 
     session = Session.objects.get(session_key=session_key) 
     uid = session.get_decoded().get('_auth_user_id') 
     user = User.objects.get(pk=uid) 

     profile = UserProfile.objects.get(pk=uid) 

     if profile: 
      return profile.dbname 
     else: 
      return None 
    except: 
     return None 

在此之後,加在你設置middleware.py。 PY

MIDDLEWARE_CLASSES = (
(..) 
    'middleware.CustomerMiddleware', 
) 

完成,作一次文件,以獲取DB路由器:

文件:authrouter:

class PadraoRouter(object): 
    def db_for_read(self, model, **hints): 
     from middleware import my_local_global 
     return my_local_global.database_name 

    def db_for_write(self, model, **hints): 
     from middleware import my_local_global 
     return my_local_global.database_name 

    def allow_relation(self, obj1, obj2, **hints): 
     return None 

    def allow_syncdb(self, db, model): 
     return True 


class AuthRouter(object): 
    def db_for_read(self, model, **hints): 
     if model._meta.app_label == 'auth': 
      return 'auth_db' 
     if model._meta.app_label == 'sessions': 
      return 'auth_db' 
     if model._meta.app_label == 'web_core': 
      return 'auth_db' 
     return None 

    def db_for_write(self, model, **hints): 
     if model._meta.app_label == 'auth': 
      return 'auth_db' 
     if model._meta.app_label == 'sessions': 
      return 'auth_db' 
     if model._meta.app_label == 'web_core': 
      return 'auth_db' 
     return None 

    def allow_relation(self, obj1, obj2, **hints): 
     if obj1._meta.app_label == 'auth' or\ 
      obj2._meta.app_label == 'auth': 
      return True 
     if obj1._meta.app_label == 'sessions' or\ 
      obj2._meta.app_label == 'sessions': 
      return True 
     if obj1._meta.app_label == 'web_core' or\ 
      obj2._meta.app_label == 'web_core': 
      return True 
     return None 

    def allow_syncdb(self, db, model): 
     if db == 'auth_db': 
      return model._meta.app_label == 'auth' 
     elif model._meta.app_label == 'auth': 
      return False 
     return None 

注:我需要把進口在每個閃避,因爲Django 1.5.1有一個bug,如果你把import導入文件頂部..循環導入..

之後,再次改變你的settings.py添加路由器:

DATABASE_ROUTERS = ['authrouter.AuthRouter', 
        'authrouter.PadraoRouter'] 

記住

我做出這種方式,因爲我有一個數據庫,只爲身份驗證。每個用戶都可以訪問不同的數據庫,這取決於什麼保存在dbname字段中。

如果您有其他解決方案,請讓我知道!

感謝大家。

相關問題