Django OneToOne字段作为表单中的下拉列表

2024-05-14 21:42:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个类似的模型:

class Report(Model):
    ...
    product_line = models.OneToOneFiled(ProductLine)

class ProductLine(Model):
    name = models.CharField()
    ...

我希望用户上传一个报告,并指定它属于哪个产品线。产品线字段应该是一个下拉列表,其中包含预定义的产品名称。在

我的问题是如何呈现这个字段以及如何分析返回的值。在

渲染

对于渲染,我想我可以这样做:

^{pr2}$

在模板中,我可以循环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对象的正确位置吗?在


Tags: thenamereport列表modelnamesmodelsline
1条回答
网友
1楼 · 发布于 2024-05-14 21:42:50

一种更简单的方法是在表单定义中添加一个产品线的额外字段:

class ReportForm(ModelForm):
    product_line = forms.ModelChoiceField(queryset=ProductLine.objects.all())

它将自动处理显示和验证下拉列表。不过,在保存之后,您需要使用cleaned_data中的值手动设置实例上的字段。在

相关问题 更多 >

    热门问题