Django:列表中没有的下拉列表值

时间:2015-05-20 08:05:43

标签: html django drop-down-menu

我正在尝试使用Django将值输入到列表中不在列表中的下拉列表中。从数据库中读取默认值 但诀窍是,用户可以看到值,但不能改变它。

有没有办法用Django来做? Django将不允许我在下拉列表中显示models.py中未定义的内容,因此对象仍为空。

有什么想法吗?也许有些走动?

由于

代码:

aList = (('OK', 'OK'), ('Not', 'Not'))

class sampleModel(models.Model):
  name = models.CharField(max_length=32, blank=True)
  res = models.CharField(max_length=10, blank=True, choices=aList)

从另一个数据库进入OK *和Not *。我需要在下拉列表中显示OK * / Not *,但是用户不能使用它,但仍然可以更改为正常OK / Not。

1 个答案:

答案 0 :(得分:1)

一个简单的选择可能是为您的选择添加一个空选择,如:

aList = (
    ('', 'OK/Not') 
    ('OK', 'OK'), 
    ('Not', 'Not')
)

并使字段res成为必需,因此您无法传递空值,因此如果用户选择空选项,表单将返回错误,直到他选择其中一个有效选项

你应该改变你的领域:

res = models.CharField(max_length=10, blank=True, choices=aList)

有:

res = models.CharField(max_length=10, choices=aList)

唯一的更改是删除 blank = True ,以便重新填写该字段。

所有这一切都假设您有一些基于模型生成的Django ModelForm

避免修改模型的其他选项可能是管理视图中的选择。如果您在HTML中选择3选项:

<select name="mySelect" id="id_mySelect">
  <option value="" selected="selected">Please select value</option>
  <option value="value1">Ok</option>
  <option value="value2">Not</option>
</select>

因此,当您在视图中收到POST时,您可以执行以下操作:

error = False
error_text = ''
# Manually get the value of the select in your view
myselect = request.POST.get('mySelect', None)

# If the value of the select is '' return an error to the template
if not myselect:
   error = True
   error_text = 'You have to select an option'
   return ('yourtemplate.html', {'error':error, 'error_text': error_text}, context_instance=RequestContext(request) )

您只需要管理您返回模板的自定义错误

你真的有很多可能去做你想做的事情,但是为了帮助我们,我们需要更多关于你项目的信息,通常是你现在拥有的代码的一部分以及你如何管理它也是。

做你想做的事情的选项:

  • 创建所需字段并使用ModelForm
  • 制作自定义表单并自定义字段验证(如@dukeboy建议的那样)
  • 选择纯HTML并在视图上管理
  • ...