我可以在不创建表单的情况下创建 Django 中不需要的管理字段吗?

Posted

技术标签:

【中文标题】我可以在不创建表单的情况下创建 Django 中不需要的管理字段吗?【英文标题】:Can I make an admin field not required in Django without creating a form? 【发布时间】:2011-11-12 13:17:24 【问题描述】:

每次我在 Django 的管理部分输入一个新播放器时,我都会收到一条错误消息,上面写着“此字段是必需的。”。

有没有一种方法可以使字段不需要创建而无需创建自定义表单?我可以在 models.py 或 admin.py 中执行此操作吗?

这是我在 models.py 中的类的样子。

class PlayerStat(models.Model):
    player = models.ForeignKey(Player)

    rushing_attempts = models.CharField(
        max_length = 100,
        verbose_name = "Rushing Attempts"
        )
    rushing_yards = models.CharField(
        max_length = 100,
        verbose_name = "Rushing Yards"
        )
    rushing_touchdowns = models.CharField(
        max_length = 100,
        verbose_name = "Rushing Touchdowns"
        )
    passing_attempts = models.CharField(
        max_length = 100,
        verbose_name = "Passing Attempts"
        )

谢谢

【问题讨论】:

最简单的方法是使用字段选项 blank=True (docs.djangoproject.com/en/dev/ref/models/fields/#blank)。有什么理由不工作吗? 【参考方案1】:

随便放

blank=True

在您的模型中,即:

rushing_attempts = models.CharField(
        max_length = 100,
        verbose_name = "Rushing Attempts",
        blank=True
        )

【讨论】:

请注意,如果您使用“表单”,blank=true 将不起作用。例如。这里模型中的 blank=true 将不起作用: class MusModelForm( forms.ModelForm ): name = forms.CharField( widget=forms.Textarea ) #~ mitglieder = forms.CharField( widget=forms.Textarea ) class Meta: model = 音乐家 如果该字段在模型级别设置为空白,这实际上意味着允许空字符串。空字符串和 null 真的不是一回事。不要仅仅因为框架设置了一些不好的默认特性就破坏了你的数据完整性。而不是设置空白,覆盖 get_form -方法:***.com/a/70212909/784642【参考方案2】:

使用空白=真,空=真

class PlayerStat(models.Model):
    player = models.ForeignKey(Player)

    rushing_attempts = models.CharField(
        max_length = 100,
        verbose_name = "Rushing Attempts",
        blank=True,
        null=True
        )
    rushing_yards = models.CharField(
        max_length = 100,
        verbose_name = "Rushing Yards",
        blank=True,
        null=True
        )
    rushing_touchdowns = models.CharField(
        max_length = 100,
        verbose_name = "Rushing Touchdowns",
        blank=True,
        null=True
        )
    passing_attempts = models.CharField(
        max_length = 100,
        verbose_name = "Passing Attempts",
        blank=True,
        null=True
        )

【讨论】:

至少从 Django 1.6 开始,您不应该在 CharFields 上需要“null=True”,甚至可能更早。对于 TextField、SlugField、EmailField 等,类似地存储为文本的任何内容。 Django 不建议对严格包含文本的字段使用“null=True”。 @Paullo "避免在基于字符串的字段(例如 CharField 和 TextField)上使用 null。如果基于字符串的字段具有 null=True,这意味着它有两个可能的“无数据”值:NULL , 和空字符串。在大多数情况下,“无数据”有两个可能的值是多余的; Django 约定是使用空字符串,而不是 NULL。一个例外是当 CharField 同时设置了 unique=True 和 blank=True 时。在这种情况下,需要 null=True 以避免在使用空白保存多个对象时违反唯一约束价值观。” docs.djangoproject.com/en/2.1/ref/models/fields/#null 虽然这个理由对我来说没有说服力。 :) @MassoodKhaari 我明白你的意思,我同意你的观点,即“理由没有说服力”。【参考方案3】:

如果该字段在模型级别设置为空白,这实际上意味着允许空字符串。空字符串和 null 真的不是一回事。不要仅仅因为框架设置了一些不好的默认功能而破坏数据完整性。

不要设置空白,而是覆盖 get_form -方法:

    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        form.base_fields["rushing_attempts"].required = False

【讨论】:

以上是关于我可以在不创建表单的情况下创建 Django 中不需要的管理字段吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不创建 django 项目的情况下使用 Django 1.8.5 ORM?

我可以在不创建自定义用户的情况下更改 Django 1.5 中的 USERNAME_FIELD 吗?

在不重新加载页面的情况下更新 Django 中的表单值?

如何在不创建其他字段的情况下生成一个列表的嵌套 formik 表单或表单字段?

Django:在不指定主键的情况下创建固定装置?

Django 中的 Ajax 正在创建重复元素