【问题标题】:Django single model multiple formDjango单模型多表单
【发布时间】:2019-11-14 01:43:12
【问题描述】:

我有一个表说 'push_message' 将推送消息发送到多个设备类型即 STB、Andriod、Feature phone。我为此创建了一个模型。但是对于不同的设备类型,不同的字段是必需的。 有什么办法可以使用不同形式的相同模型(假设 STB 和 Android)

class PushNotification(models.Model):
    id = models.AutoField(primary_key=True)
    sched_at = models.DateTimeField(default=timezone.now)
    message = models.TextField(max_length=500)
    alert_ty = models.CharField(max_length=64, choices=Options.alert_type())
    title = models.CharField(max_length=127)
    device_ty = models.CharField(max_length=24, choices=Options.get_devices())

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

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

提前致谢。

【问题讨论】:

    标签: django python-3.x


    【解决方案1】:

    Model 严格表示 django 中的数据库。因此,“可选”需要一些字段是行不通的。我建议在数据库中将它们创建为“不需要”,然后将它们定义为所需的 (required = True) 形式:

    class SomeCustomForm(DefaultForm):
        form_field = forms.BooleanField( label='Very important field'),
                                         required=True,
                                         error_messages={'required':'Can`t proceed without this'})
    

    如果您想要一个包含设备列表的下拉列表并根据它验证表单,您可能需要按照文档 (https://docs.djangoproject.com/en/2.2/ref/forms/validation/) 使用自定义 clean()

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

    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."
                )
    

    【讨论】:

    • 感谢您提供意见。解决方案对我不起作用。假设我有一些不同格式的文档(pdf、word、odt),对于不同的格式,不建议创建单独的表模型。我想问题现在更清楚了。
    • 为什么不建议创建更多的表?大多数关于关系数据库的公认智慧表明并非如此。尽管文档表可以很好地处理不同的文件类型和接收设备规范字段。
    • @nigel222 仅基于一个属性,不建议创建新表。这里根据设备类型我们需要设置属性值。它是创建单独表格的唯一解决方案吗?(我认为在多种文档类型中,即 word、pdf、excel 等)根据我的理解需要为内容文档类型创建。
    • @dinu0101,您可以在 db 中创建不需要的字段并调用 clean() 方法来检查表单提交期间的数据完整性,如前所述 - 然后您可以将所有内容放入一张桌子
    • @Serhii,你能和我分享链接或样品吗?如你所说。我是 Python 和 Django 的新手。感谢您的指导和支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多