选择字段中的 Django 空标签 - 无查询集

标签 django forms

在选择字段上设置空标签给我带来了一些问题。我看过像 this 这样的答案,但这只是在谈论形式。

假设我有以下模型:

class MyColorModel(models.Model):
    BLUE = 'blue'
    RED = 'red'
    GREEN = 'green'
    COLOR_CHOICES = (
        (BLUE, 'Blue'),
        (RED, 'Red'),
        (GREEN, 'Green'))

   my_color = models.CharField(max_length=5, choices=COLOR_CHOICES, blank=True)

还有这个表格:

class MyColorForm(forms.ModelForm):
   class Meta:
       model = MyColorModel
       fields = ['mycolor']

默认情况下,这将显示一个选择字段,空白标签设置为 ------

我想出了以下选项来设置标签。

1) 将我的模型中的 COLOR_CHOICES 更改为:

COLOR_CHOICES = (
    ('', '---Please select your color---'),
    (BLUE, 'Blue'),
    (RED, 'Red'),
    (GREEN, 'Green'),

2) 将我的模型中的 COLOR_CHOICES 更改为:

COLOR_CHOICES = (
    (None, '---Please select your color---'),
    (BLUE, 'Blue'),
    (RED, 'Red'),
    (GREEN, 'Green'),

3) 将以下init 方法添加到我的模型form:

def __init__(*args, **kwargs):
    super(MyColorForm, self).__init__(*args, **kwargs)
    self.fields['my_color'].choices =  [('', '---Please select your color---')] + MyColorModel.COLOR_CHOICES

选项 1 导致了一些副作用,即我开始失败的 if 语句,这就是导致我创建选项 2 的原因。

将空白标签添加到我的模型(选项 2)是否合适?如果我把它加在那里有什么副作用,还是把它加在表格上更好?当我在表单中设置空标签时,似乎有很多代码。

最佳答案

在表单上设置你想要的是实现你想要的更正确的方法。在 Django 中,模型包含您存储的数据的基本字段和行为。也就是说,它们定义了您的信息在数据库中的结构。

1.我没有查,但是你的第一个选项
COLOR_CHOICES = (
    ('', '---Please select your color---'),
    (BLUE, 'Blue'),
    (RED, 'Red'),
    (GREEN, 'Green'),

my_color = models.CharField(max_length=5, choices=COLOR_CHOICES)

可能不起作用,因为您的第一选择是空字符串,但您的 my_color 字段不包含 blank=True 参数。这意味着它不允许将空字符串保存到数据库中。但是如果您希望此字段是强制性的,那么您对空选择的定义不应该在这里,因为它不会带来任何附加值,因为它不包含有关您的数据结构的任何附加信息。

2. 你的第二个选择绝对不是要走的路[1] :

Avoid using null on string-based fields such as CharField and TextField because empty string values will always be stored as empty strings, not as NULL. If a string-based field has null=True, that means it has two possible values for “no data”: NULL, and the empty string. In most cases, it’s redundant to have two possible values for “no data;” the Django convention is to use the empty string, not NULL.

3. 你的第三个选项看起来不错。我有一段时间没有使用 django 表单,但如果你的代码有效,那么表单是一个更适合定义表单外观的地方,而不是在你的模型中做它,所以选择那个选项。

或者查看您帖子中链接的 SO 问题的解决方案并实现这些解决方案。

祝你好运!

关于选择字段中的 Django 空标签 - 无查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37223688/

相关文章:

php - textarea 中的输入不会在 mysql 表中更新

javascript - 如何在不触发页面加载的情况下单击柏树中的表单按钮

javascript - 使用 JavaScript/jQuery 对数组进行表单验证

django - django 管理列表中的外键显示

python - 如何使用 FileField 在 django 中浏览服务器端文件?

php 使用表单重定向

javascript - 将表格提交到特定窗口

python - django 测试 response.context TypeError : 'NoneType' object is not subscriptable

python - Django - 获取存储在外键中的对象

django - 在 Django 中的表单中使用两个模型