【问题标题】:Error using Django model forms with multiple databases使用具有多个数据库的 Django 模型表单时出错
【发布时间】:2015-10-07 14:52:32
【问题描述】:

我想在我的应用中使用外键创建一个简单的表单。我有两个数据库,一个是 Django 的默认数据库,另一个是旧数据库。

显示的错误消息如下:表 'django.customer' 不存在。但我想选择我的其他数据库,而不是 Django。我该怎么做?

这是我的模型:

from django.db import models
from register.models import Customer

class Service(models.Model):
    # ..
    customer = models.ForeignKey('register.Customer', db_column='customer')
    # ..

这是其他应用程序中的其他模型。

class Customer(models.Model):
    codigo = models.AutoField(primary_key=True)

这两个应用程序都在其他数据库中,而不是 Django。

我的设置.py:

DATABASES = {
    'default': {
        'NAME': 'django',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'my-user',
        'PASSWORD': 'my-password',
        'HOST': '',
        'PORT': ''
    },
    'other-database': {
        'NAME': 'other-database',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'my-user',
        'PASSWORD': 'my-password',
        'HOST': '',
        'PORT': ''
    }
}

我在 HTML 中写了这个:

{{ form_service }}

这是我的forms.py

from attendance.models import Service
from register.models import Customer
from django.http import HttpResponseRedirect, HttpResponse
from django.core.exceptions import ValidationError

class FormService(ModelForm):

    class Meta:
        model = Service
        fields = ('my_fields', 'my_fields', 'customer')

这是我的views.py

def service(request):
    form_service = FormService()
    return render(request, 'service.html', {'form_service': form_service})

我认为错误就在这里。也许我必须定义我的其他数据库,它应该在 Django 数据库中选择。

我试过了,但没用。

def service(request):
    queryset = Customer.objects.using('other-database').all()
    form_service = FormService(instance = queryset)

    return render(request, 'service.html', {'form_service': form_service})

【问题讨论】:

  • Django 数据库是指settings.py 文件中的默认数据库吗?您是否在settings.py 文件中定义了您的第二个数据库?
  • 请更明确地说明您的问题名称,以便其他有您问题的人使用。
  • 是的,我的 settings.py 已经定义了两个数据库。

标签: python django django-forms


【解决方案1】:

您的代码instance = queryset 没有意义,因为instance 应该是表单的服务实例,而不是客户实例的查询集。

尝试在表单的__init__ 方法中设置字段的查询集。

class FormService(ModelForm):
    def __init__(self, *args, **kwargs):
        super(FormService, self).__init__(*args, **kwargs)
        self.fields['customer'].queryset = Customer.objects.using('other-database').all()

    class Meta:
        model = Service
        fields = ('my_fields', 'my_fields', 'customer')

如果这不起作用,请更新您的问题并发布完整的回溯。

【讨论】:

  • 我是 OOP 的新手。我尝试了您的回答,但显示此消息:super(type, obj): obj must be an instance or subtype of type.
  • 对不起,我写错了。消息停止了。现在我的表单没有出现在我的模板中。
  • 只要您在视图中保留form_service = FormService(),上面的代码不应该使表单消失。您还没有编写任何代码来处理表单。阅读working with forms in the view 上的文档以开始使用。
  • 它出现在之前,当我在 forms.py 中删除我的字段的客户时。
  • 从你提供的信息看,我看不出表格消失的原因。希望你找出问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 2019-03-15
  • 2016-09-10
  • 2015-02-12
  • 2014-09-17
  • 1970-01-01
相关资源
最近更新 更多