Django Templateform与多个数据库的问题

时间:2018-05-21 18:54:23

标签: python django django-forms django-templates

我正在尝试在我的Django项目中使用多个数据库。

如您所见,我正在尝试使用custom数据库而不是default。在其他函数中,从`objects.using ='database'。

中提到的数据库中正确提取数据

只有在尝试使用django Templateform保存表单数据时才会考虑default数据库,并且我收到如下错误:

Exception Type: OperationalError
Exception Value:    
no such table: base_clientprofile
Exception Location: /opt/.../.../lib/python2.7/site-packages/django/db/backends/sqlite3/base.py in execute, line 485

以下是我的配置和代码示例。

settings.py

DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        },
        'trace_one': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'somename',
            'USER': 'rootuser',
            'PASSWORD': 'password',
        }
    }

DATABASES_ROUTERS = ['DefaultRouter', 'TraceProdRouter']

forms.py

class TraceClientProfileForm(forms.ModelForm):
    class Meta:
        model = ClientProfile
        fields = [
            'full_name',
            'short_name',
            'address',
            ]

views.py

def trace_post_model_client_create_view(request):
    form = TraceClientProfileForm(request.POST or None)
    if form.is_valid():
        obj = form.save(commit=False)
        obj.save(using='trace_one')
        return HttpResponseRedirect("/traceviews/{num}".format(num=obj.id))
    context = {
        "form": form
    }
    template = "trace_tmpl/trace_client_create_view.html"
    return render(request, template, context)

urls.py

urlpatterns = patterns(
    '',
    url(r'^create/$', trace_post_model_client_create_view, name='traceclientcreate'),

)

routers.py

class MasterRouter(object):
    def __init__(self, app_label):
        super(MasterRouter, self).__init__()
        self.app_label = app_label

    def db_for_read(self, model, **hints):
        if model._meta.app_label == self.app_label:
            return self.app_label
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == self.app_label:
            return self.app_label
        return None

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

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


class DefaultRouter(MasterRouter):
    def __init__(self):
        super(DefaultRouter, self).__init__('default')


class TraceProdRouter(MasterRouter):
    def __init__(self):
        super(TraceProdRouter, self).__init__('trace_one')

0 个答案:

没有答案