2013-07-23 2 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) 

Как я могу заставить использовать конкретную базу данных?

Я не могу использовать дб маршрутизатор, потому что «конкретные» базы данных настройки в моем профиле пользователя, и я не знаю, как получить UserProfile в классе дб-маршрутизатор ..

Я знаю, что могу используйте в 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 в ваших настройки. ру:

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

закончить, сделать еще один файл, чтобы получить дб маршрутизатор:

Файл: 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 имеет ошибку, если вы поместили импорт в верхнюю часть файла .. цикл импорта ..

после этого, измените ваш settings.py добавить маршрутизатор:

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

Запомнить

Я делаю это так, потому что у меня одна база данных, только для Идент .. Каждый пользователь может открыть другую базу данных, в зависимости от того, что сохраняется в поле dbname.

Если у вас есть другие проблемы, пожалуйста, дайте мне знать!

Спасибо всем.

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