我有两个相关的模型:
class Report(Model):
...
product_line = models.OneToOneFiled(ProductLine)
class ProductLine(Model):
name = models.CharField()
...
我希望用户上传报告并指定它所属的产品系列。产品系列字段应该是一个下拉列表,其中包含预定义的产品名称。
我的问题是如何渲染此字段以及如何分析回发的值。
对于渲染,我想我可以这样做:
render():
allProducts = ProductLine.objects.all() // side question: how to cache this queryset for repeated use?
names = []
for p in allProducts:
names.push(p.name)
return render(..., {'names': names})
在模板中,我可以遍历names
并填充下拉列表中的项目。我是对的吗?
保存时:
postHandler():
// This is the part I am not so sure
// Since the value for the product line field will be a string
// I guess I cannot rely on a form object to validate it and expect
// it to pass, am I correct?
// so when I create a form out of ProductLine, I should use
// a customized validator instead:
class ReportForm(Form):
class Meta:
model = Report
clean_product_line():
cd = self.cleaned_data
allProducts = ProductLine.objects.all()
valid_names = []
for p in allProducts:
valid_names.push(p.name)
if cd in valid_names:
return allProducts.filter(name=cd)[0]
raise ValidationError('Invalid product name')
这种做法是否正确? clean_product_line
是否适合验证并返回model
对象?
答案 0 :(得分:0)
更简单的方法是将产品系列的额外字段添加到表单定义中:
class ReportForm(ModelForm):
product_line = forms.ModelChoiceField(queryset=ProductLine.objects.all())
这将自动负责显示和验证下拉列表。使用cleaning_data中的值后,您需要在保存后手动设置实例上的字段。