python - 自定义/删除Django选择框空白选项

我正在使用Django 1.0.2。 我写了一个由Model支持的ModelForm。 此模型有一个ForeignKey,其中blank = False。 当Django为此表单生成HTML时,它会创建一个选择框,其中包含ForeignKey引用的表中每一行的一个选项。 它还在列表顶部创建一个没有值的选项,并显示为一系列破折号:

---------

我想知道的是:

从选择框中删除此自动生成选项的最简洁方法是什么?

定制它的最简洁方法是什么,以便它显示为:

Select Item

在寻找解决方案时,我遇到了Django票4653,这给我的印象是其他人有同样的问题,并且Django的默认行为可能已被修改。 这张票超过一年,所以我希望可能有更清洁的方法来完成这些事情。

谢谢你的帮助,

杰夫

编辑:我已经配置了ForeignKey字段:

verb = models.ForeignKey(Verb, blank=False, default=get_default_verb)

这确实设置了默认值,因此它不再是空/短划线选项,但不幸的是它似乎无法解决我的任何问题。 也就是说,空/破折号选项仍然出现在列表中。

15个解决方案

82 votes

没有测试过这个,但基于阅读Django的代码在这里和我认为它应该工作:

class ThingForm(models.ModelForm):

class Meta:

model = Thing

def __init__(self, *args, **kwargs):

super(ThingForm, self).__init__(*args, **kwargs)

self.fields['verb'].empty_label = None

编辑:这是记录的,但如果你正在使用自动生成的ModelForm,你不一定知道寻找ModelChoiceField。

编辑:正如jlpp在他的回答中所说,这是不完整的 - 你必须在更改empty_label属性后重新将选项分配给小部件。 由于这有点hacky,可能更容易理解的另一个选项是覆盖整个ModelChoiceField:

class ThingForm(models.ModelForm):

verb = ModelChoiceField(Verb.objects.all(), empty_label=None)

class Meta:

model = Thing

Carl Meyer answered 2019-06-18T17:56:54Z

33 votes

来自文档

空白选择不包括在内   如果模型字段为空= False和   显式默认值(默认值   最初将选择值   代替)。

所以设置默认值就可以了

zalew answered 2019-06-18T17:57:33Z

22 votes

以Carl的回答为指导,在Django源码周围生根几个小时后,我认为这是完整的解决方案:

要删除空选项(扩展Carl的示例):

class ThingForm(models.ModelForm):

class Meta:

model = Thing

def __init__(self, *args, **kwargs):

super(ThingForm, self).__init__(*args, **kwargs)

self.fields['verb'].empty_label = "Select a Verb"

# following line needed to refresh widget copy of choice list

self.fields['verb'].widget.choices =

self.fields['verb'].choices

要自定义空选项标签基本相同:

class ThingForm(models.ModelForm):

class Meta:

model = Thing

def __init__(self, *args, **kwargs):

super(ThingForm, self).__init__(*args, **kwargs)

self.fields['verb'].empty_label = "Select a Verb"

# following line needed to refresh widget copy of choice list

self.fields['verb'].widget.choices =

self.fields['verb'].choices

我认为这种方法适用于将ModelChoiceFields呈现为HTML的所有场景,但我并不积极。 我发现当初始化这些字段时,它们的选择将传递给Select小部件(请参阅django.forms.fields.ChoiceField._set_choices)。 初始化后设置empty_label不会刷新Select小部件的选项列表。 我对Django不太熟悉,知道这是否应该被视为一个bug。

jlpp answered 2019-06-18T17:58:29Z

18 votes

您可以在模型上使用它:

class MyModel(models.Model):

name = CharField('fieldname', max_length=10, default=None)

默认=无答案:D

注意:我在Django 1.7上试过这个

Lu.nemec answered 2019-06-18T17:59:08Z

8 votes

至于django 1.4你需要的是在选择字段上设置“默认”值和“空白=假”

class MyModel(models.Model):

CHOICES = (

(0, 'A'),

(1, 'B'),

)

choice_field = models.IntegerField(choices=CHOICES, blank=False, default=0)

ykhrustalev answered 2019-06-18T17:59:33Z

5 votes

请参阅此处,了解有关此问题的完整辩论和解决方法。

Thomas B. Higgins answered 2019-06-18T17:59:58Z

5 votes

你可以在管理员中这样做:

formfield_overrides = {

models.ForeignKey: {'empty_label': None},

}

holmes86 answered 2019-06-18T18:00:24Z

4 votes

BaseForm无效如果您的字段类型是TypedChoiceField,它没有empty_label属性。

我们应该做的是删除第一选择:

1。 如果你想建立一个BaseForm自动检测TypedChoiceField

class BaseForm(forms.ModelForm):

def __init__(self, *args, **kwargs):

super(BaseForm, self).__init__(*args, **kwargs)

for field_name in self.fields:

field = self.fields.get(field_name)

if field and isinstance(field , forms.TypedChoiceField):

field.choices = field.choices[1:]

# code to process other Field

# ....

class AddClientForm(BaseForm):

pass

2.只有几种形式,你可以使用:

class AddClientForm(forms.ModelForm):

def __init__(self, *args, **kwargs):

super(AddClientForm, self).__init__(*args, **kwargs)

self.fields['xxx'].choices = self.fields['xxx'].choices[1:]

Mithril answered 2019-06-18T18:01:09Z

2 votes

今天我正在搞乱这个问题,刚刚提出了一个懦夫黑客的漂亮解决方案:

# Cowardly handle ModelChoiceField empty label

# we all hate that '-----' thing

class ModelChoiceField_init_hack(object):

@property

def empty_label(self):

return self._empty_label

@empty_label.setter

def empty_label(self, value):

self._empty_label = value

if value and value.startswith('-'):

self._empty_label = 'Select an option'

ModelChoiceField.__bases__ += (ModelChoiceField_init_hack,)

现在,您可以将默认的ModelChoiceField空标签调整为您想要的任何内容。:-)

PS:不需要downvotes,无害的猴子补丁总是很方便。

emyller answered 2019-06-18T18:01:49Z

2 votes

对于最新版本的django第一个答案应该是这样的

class ThingForm(models.ModelForm):

class Meta:

model = Thing

def __init__(self, *args, **kwargs):

self.base_fields['cargo'].empty_label = None

super(ThingForm, self).__init__(*args, **kwargs)`

lwj0012 answered 2019-06-18T18:02:14Z

2 votes

对于CharField字段,在模型上将default值设置为None将删除空白选项。

verb = models.ForeignKey(Verb, on_delete=models.CASCADE, default='')

对于其他字段,如CharField,您可以将default设置为None,但这不适用于Django 1.11中的ForeignKey字段。

YPCrumble answered 2019-06-18T18:02:49Z

1 votes

我找到解决方案!

但不适用于ForeignKey :-)

或许我可以帮你。我查看了Django源代码并发现在django.forms.extras.widgets.SelecteDateWidget()中是一个名为none_value的属性,它等于(0,'-----')所以我在我的代码中这样做了

class StudentForm(ModelForm):

class Meta:

this_year = int(datetime.datetime.today().strftime('%Y'))

birth_years = []

years = []

for year in range(this_year - 2, this_year + 3 ):

years.append(year)

for year in range(this_year - 60, this_year+2):

birth_years.append(year)

model = Student

exclude = ['user', 'fullname']

date_widget = SelectDateWidget(years=years)

date_widget.__setattr__('none_value', (0, 'THERE WAS THAT "-----" NO THERES THIS:-)'))

widgets = {

'beginning': date_widget,

'birth': SelectDateWidget(years=birth_years),

}

user3002411 answered 2019-06-18T18:03:30Z

0 votes

这里有很多很棒的答案,但我对这些实现还不是很满意。 我也有点沮丧的是,来自不同来源(外键,选择)的选择小部件会产生不同的行为。

我有一个我正在使用的设计,其中选择字段总是有一个空白选项,如果它们是必需的,它们旁边会有一个星形,表单将不会验证它们是否为空。 也就是说,我只能为不是__init__s的字段正确覆盖empty_label。

这是结果应该是什么样子。 第一个结果始终是字段的名称 - 在我的例子中,是__init__。

这就是我最终做的事情。 以下是我的表格重写的__init__方法:

def __init__(self, *args, **kwargs):

super().__init__(*args, **kwargs)

for _, field in self.fields.items():

if hasattr(field, 'empty_label'):

field.empty_label = field.label

if isinstance(field, forms.TypedChoiceField):

field.choices = [('', field.label)] + [choice for choice in field.choices if choice[0]]

Jamie Counsell answered 2019-06-18T18:04:19Z

0 votes

从Django 1.7开始,您可以通过在模型字段定义中的选项列表中添加值来自定义空白值的标签。 从有关配置字段选择的文档中:

除非在字段上设置了blank = False以及默认值,否则将使用选择框呈现包含“---------”的标签。 要覆盖此行为,请将元组添加到包含None的选项中; 例如 (无,'你的显示字符串')。 或者,您可以在有意义的地方使用空字符串而不是None - 例如在CharField上。

我检查了不同版本的Django的文档,发现这是在Django 1.7中添加的。

Rebecca Koeser answered 2019-06-18T18:05:01Z

0 votes

当选择是外键并且您想要根据某些条件筛选选项时,这会变得更加复杂。 在这种情况下,如果您设置empty_label,然后重新分配选项(您也可以在此处应用过滤),空标签将为空白:

class ThingForm(models.ModelForm):

class Meta:

model = Thing

def __init__(self, *args, **kwargs):

super(ThingForm, self).__init__(*args, **kwargs)

self.fields['verb'].empty_label = None

self.fields['verb'].queryset=Verb.objects.all()

基本上,init下的第一行可以应用于循环或内联循环的表单中的所有字段:

def __init__(self,user, *args, **kwargs):

super(NewTicket, self).__init__(*args, **kwargs)

for f in self.fields:

self.fields[f].empty_label = None # or "Please Select" etc

Ibo answered 2019-06-18T18:05:35Z

python选择框_python - 自定义/删除Django选择框空白选项相关推荐

  1. python弹出框多一个空白框_python – 自定义/删除Django选择框空白选项

    没有测试这个,但基于阅读Django的代码 here和 here我相信它应该工作: class ThingForm(models.ModelForm): class Meta: model = Thi ...

  2. python去掉两边空格_Python模拟删除字符串两边的空白

    目标: 1.使用string模块的whitespace 2.删除左边.右边以及两边的空白 代码如下: [root@localhost python]# cat rmspace.py #!/usr/bi ...

  3. Android自定义人脸识别框,android自定义虹软人脸识别框/人脸抓拍框/人脸追踪框...

    有一两个月没有更新博客了,最近一直在忙人脸识别的项目,先将项目中更改虹软人脸框的方法抽取出来,希望对大家有所帮助. 尊重原创,转载请注明出处: http://blog..net/qq137722697 ...

  4. python dataframe切片_python pandas dataframe 行列选择,切片操作方法

    SQL中的select是根据列的名称来选取:Pandas则更为灵活,不但可根据列名称选取,还可以根据列所在的position(数字,在第几行第几列,注意pandas行列的position是从0开始)选 ...

  5. python tkinter 勾选框_Python Tkinter网格复选框

    我想知道是否有一种简单的方法来使用Tkinter创建一个复选框网格.我正在尝试制作10行和10列的网格(所以100个复选框),这样每行只能选择两个复选框. 编辑:我正在使用spthon的python ...

  6. pythonselenium浮动框_python上selenium的弹框操作实现

    selenium之弹框操作 1,分类 弹框类型自见解分为四种: 1,页面弹框 2,警告提示框(alert) 3,确认消息框(confirm) 4,提示消息对话(prompt) 提示: selenium ...

  7. python tk窗口 选择 销毁_Python tkinter - 删除其他窗口 - 已调用tk.withdraw()

    我正在编写一个小程序,在某些情况下,它会打开两个不同的文件浏览器. 起初,用户可以选择一个文件夹.如果该文件适合他,他可以关闭文件资源管理器窗口,另一个可以打开用户选择特定文件的窗口. 就像第二个文件 ...

  8. python 条件选择语句_Python趣味入门4:选择往往是最重要的-条件语句

    人生处处有选择,程序也有选择,为了让程序变得更加强壮,程序员必须考虑任何情况,上一篇了解到了如何使用Python来行顺序语句的编写,我们写了一个可以输入姓名的生日祝贺程序,今天我们挑战条件语句! 1. ...

  9. python定义词典_python – 自定义类是一个字典,但初始化没有字典副本?

    出于易读性的目的,我希望有一个自定义类,其行为与dict完全相同(但是带有有意义的类型,而不是更通用的dict类型): class Derivatives(dict): "Dictionar ...

最新文章

  1. <笔记2>numpy的生成随机数用法小记
  2. 【译】Angular 5 新特性
  3. matlab pause
  4. vue php 增删改查,vue的增删改查(简单版)
  5. DCMTK:DSRDocumentTree,DSRDocumentSubTree,DSRDocumentTreeNode和DSRContentItem类的测试程序
  6. matlab 动态库 二次调用,LINUX matlab编译动态库调用崩溃
  7. dw替换多个html标签,DW查找替换的技巧
  8. leach算法的实现过程_LEACH算法的MATLAB代码.doc
  9. 计算机操作系统出现死锁的原因
  10. 数据结构_C语言_实验三_图 ——六度空间
  11. c语言变量类型char,C语言中char变量详解
  12. markdown添加目录
  13. CPU内核和逻辑处理器的区别
  14. IOS13图标尺寸_7大原则,带你设计出更优秀的图标
  15. 哪款蓝牙耳机戴着舒服?佩戴舒适度高的四款蓝牙耳机推荐
  16. 对于信息安全与管理的理解
  17. 詹姆斯·高斯林-JAVA之父
  18. Java爬虫——爬取体彩网足球赛果
  19. 通过HttpWebRequest实现模拟登陆
  20. c语言程序设计 下 答案,C语言程序设计含答案.doc

热门文章

  1. 创建商品表中插入一条数据/图书表中新增一条记录/学生表中,要求查询姓张,并且年龄在18到25岁之间的学生/查询article文章表
  2. 解决Coursera的视频不能播放问题
  3. 【跨境电商】Zendesk最佳替代品,5款客服插件推荐
  4. 【2021最新版】Python 并发编程实战,用多线程、多进程、多协程加速程序运行
  5. 重要的流程控制 循环 for的那些事
  6. HBASE的hmaster报java.lang.RuntimeException: HMaster Aborted
  7. 电脑好玩技巧1——回收站图标更改
  8. 青海旅游开启“互联网+”模式
  9. 第二证券|新能源优势突出 青海加速储能产业布局
  10. 谷歌地图如何将经纬度转换为pixel屏幕像素点