Django单模型多形式

Django单模型多形式,django,python-3.x,Django,Python 3.x,我有一张表,上面写着“推送信息”,可以将推送信息发送到多个设备类型,即机顶盒、安卓、功能手机。我为此创建了一个模型。但不同的设备类型必须有不同的字段。 我有没有办法用不同的形式使用相同的型号(假设STB和Android) 根据设备类型,少数字段可能是必需的。所以我想根据用户选择的设备制作表单 请提供您的意见,我如何在Django 2.1中实现这一点 提前感谢。模型严格地表示django中的数据库。因此,让某些字段“可选”为必填字段是行不通的。我建议在db中将它们创建为“非必需”,然后将它们定义为

我有一张表,上面写着“推送信息”,可以将推送信息发送到多个设备类型,即机顶盒、安卓、功能手机。我为此创建了一个模型。但不同的设备类型必须有不同的字段。 我有没有办法用不同的形式使用相同的型号(假设STB和Android)

根据设备类型,少数字段可能是必需的。所以我想根据用户选择的设备制作表单

请提供您的意见,我如何在Django 2.1中实现这一点


提前感谢。

模型严格地表示django中的数据库。因此,让某些字段“可选”为必填字段是行不通的。我建议在db中将它们创建为“非必需”,然后将它们定义为必需的(required=True),格式如下:

class SomeCustomForm(DefaultForm):
    form_field = forms.BooleanField( label='Very important field'),
                                     required=True,
                                     error_messages={'required':'Can`t proceed without this'})
如果您想要一个包含设备列表的下拉列表,并根据该列表验证表单,您可能需要按照文档()使用自定义clean()

表单子类的clean()方法可以执行需要访问多个表单字段的验证。您可以在此处进行检查,例如“如果提供了字段A,则字段B必须包含有效的电子邮件地址”。如果愿意,此方法可以返回一个完全不同的字典,该字典将用作已清理的\u数据


谢谢你提供的意见。这个解决方案对我不起作用。假设我有一些不同格式的文档(pdf、word、odt),对于不同的格式,不建议创建单独的表模型。我想问题现在更清楚了。为什么不建议创建更多的表呢?大多数关于关系数据库的公认智慧都提出了相反的观点。虽然文档表可以很好地处理不同的文件类型和收件人设备规范字段。@nigel222仅基于一个属性,但不建议创建新表。这里根据设备类型,我们需要设置属性值。这是创建单独表格的唯一解决方案吗?(我认为在多文档类型中,如word、pdf、excel等)需要创建内容文档类型,据我所知。@dinu0101,您可以在db中创建非必填字段并调用clean()方法在表单提交过程中检查数据完整性,如我前面所述-然后您可以将所有内容放在一个表中table@Serhii,你愿意和我分享你所说的链接或样品吗。我是Python和Django的新手。感谢您的指导和支持。
class SomeCustomForm(DefaultForm):
    form_field = forms.BooleanField( label='Very important field'),
                                     required=True,
                                     error_messages={'required':'Can`t proceed without this'})
from django import forms

class ContactForm(forms.Form):

def clean(self):
    cleaned_data = super().clean()
    cc_myself = cleaned_data.get("cc_myself")
    subject = cleaned_data.get("subject")

    if cc_myself and subject:
        # Only do something if both fields are valid so far.
        if "help" not in subject:
            raise forms.ValidationError(
                "Did not send for 'help' in the subject despite "
                "CC'ing yourself."
            )