在选择字段上设置空标签给我带来了一些问题。我看过像 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
参数。这意味着它不允许将空字符串保存到数据库中。但是如果您希望此字段是强制性的,那么您对空选择的定义不应该在这里,因为它不会带来任何附加值,因为它不包含有关您的数据结构的任何附加信息。
3. 你的第三个选项看起来不错。我有一段时间没有使用 django 表单,但如果你的代码有效,那么表单是一个更适合定义表单外观的地方,而不是在你的模型中做它,所以选择那个选项。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.
或者查看您帖子中链接的 SO 问题的解决方案并实现这些解决方案。
祝你好运!
关于选择字段中的 Django 空标签 - 无查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37223688/