【发布时间】:2016-05-14 20:56:48
【问题描述】:
我在settings.py 中定义了两个不同的数据库连接('default' 和 'banco1')。
然后在某些视图中,我收到一个 POST,其中包含一些我想根据我创建的 ModelForm 验证的数据:
product_form = ProductForm(request.POST)
if product_form.is_valid():
产品型号:
class Product(models.Model):
name = models.CharField(max_length=125, blank=False, null=False)
description = models.CharField(max_length=255, blank=True)
abbreviation = models.CharField(max_length=15, blank=True)
category = models.ForeignKey('inventory.Category',
on_delete=models.SET_NULL, null=True, blank=True)
metric = models.CharField(max_length=15, blank=True, null=True)
形式:
class ProductForm(ModelForm):
class Meta:
model = Product
fields = ['name', 'description', 'abbreviation', 'category', 'metric']
观点:
def create(request):
if request.method != 'POST':
return JsonResponse('Operação inválida', safe=False)
product_form = ProductForm(request.POST)
if product_form.is_valid():
f = product_form.save(commit = False)
f.save(using=request.session['database'])
return HttpResponse("Novo product salvo com sucesso")
else:
return HttpResponse("Impossível salvar product. Verifique os campos")
产品模型应该始终保存在“banco1”数据库中,因此应该从“banco1”数据库中查询 FK 验证,但是每当我尝试使用 product_form.is_valid() 进行验证时,Django 都会尝试查询“默认值” ' 数据库并引发验证错误,因为在 'default' 数据库中无法满足 FK 约束。
如何设置模型表单以对手动选择的数据库进行验证?
编辑
有人建议我使用 DB ROUTER 模式来选择正确的数据库配置,这很好。我的问题是,这种选择应该基于一些标准,而不仅仅是模型。如何将视图中的一些变量传递给我的数据库路由器类中的db_for_read 方法?
EDIT2
新的 ProductForm 类
class ProductForm(ModelForm):
class Meta:
model = Product
fields = ['name', 'description', 'abbreviation', 'category', 'metric']
def __init__(self,database):
category = forms.ModelChoiceField(queryset=Category.objects.using(database).all())
尝试像这样在我的视图中实例化表单:
product_form = ProductForm(request.POST, request.session['database'])
这给了我一个错误:
init() 接受 2 个位置参数,但给出了 3 个
我知道我重写 __init__ 方法的方式是无效的,但我在 python 中没有意识到这一点。
编辑 3
最后的错误:
追溯:
文件“C:\Users\Pavarine\Documents\Visual Studio 2015\Projects\gims\gims\env\lib\site-packages\django\core\handlers\base.py" 在 get_response 中 149. response = self.process_exception_by_middleware(e, request)
文件“C:\Users\Pavarine\Documents\Visual Studio 2015\Projects\gims\gims\env\lib\site-packages\django\core\handlers\base.py" 在 get_response 中 147. response = Wrapped_callback(request, *callback_args, **callback_kwargs)
文件“C:\Users\Pavarine\Documents\Visual Studio 2015\Projects\gims\gims\gims\apps\inventory\views.py" 在创建 247. if product_form.is_valid():
文件“C:\Users\Pavarine\Documents\Visual Studio 2015\Projects\gims\gims\env\lib\site-packages\django\forms\forms.py" 在 is_valid 161. 返回 self.is_bound 而不是 self.errors
文件“C:\Users\Pavarine\Documents\Visual Studio 2015\Projects\gims\gims\env\lib\site-packages\django\forms\forms.py" 在错误中 153. self.full_clean()
文件“C:\Users\Pavarine\Documents\Visual Studio 2015\Projects\gims\gims\env\lib\site-packages\django\forms\forms.py" 在 full_clean 362. self._clean_fields()
文件“C:\Users\Pavarine\Documents\Visual Studio 2015\Projects\gims\gims\env\lib\site-packages\django\forms\forms.py" 在 _clean_fields 374. value = field.widget.value_from_datadict(self.data,self.files, self.add_prefix(name))
文件“C:\Users\Pavarine\Documents\Visual Studio 2015\Projects\gims\gims\env\lib\site-packages\django\forms\widgets.py" 在 value_from_datadict 中 231. 返回数据.get(name)
异常类型:AttributeError at /inventory/product/create 异常 值:'tuple' 对象没有属性 'get'
【问题讨论】:
-
您是否有一个DB router 设置告诉它使用
banco1作为db_for_read用于Product模型? -
@mragh 我可以做到这一点,但现在我想到了另一个相关的问题。我将编辑我的问题。
-
请出示完整的表格并查看。
-
@Alasdair 我已经更新了问题
-
我在@Nikita 的回答中添加了一条评论,因为它与我的建议非常相似。
标签: python django django-models django-forms