首页 > 解决方案 > Django单模型多表单

问题描述

我有一个表说'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 中实现这一点。

提前致谢。

标签: djangopython-3.x

解决方案


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

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

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

表单子类的 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."
            )

推荐阅读