Django:获取 FormField 的下拉值
Django: get drop-down values for a FormField
目标是让下拉菜单正常工作。
将整个 Model / ModelForm 作为 {{ form }}
输入到 html 模板时通常没有问题
下面 html 代码片段是我的目标,但我想提供子集 {{ form.car_model_make }}
而不是 {{ form }}
并让 Django 自动创建所有选项 <option value="BWM">BMW</option>
...等等
# models.py
class Product(models.Models):
car_model_make = models.CharField(default='B', max_length=1, blank=True, choices=CAR_TYPE)
status_is_secondhand = models.BooleanField(blank=True)
# forms.py
class ProductForm(ModelForm):
class Meta:
model = Product
fields = ('__all__')
# views.py
class ProductFormView(FormView):
form_class = ProductForm
def form_valid(self, form):
form.save()
return super().form_valid(form)
def get_success_url(self):
return reverse('index')
# urls.py
urlpatterns = [
path('', index, name='index'),
path('product/', ProductFormView.as_view(template_name='product/product.html'), name='product'),
]
选项 CAR_TYPE 是一个包含 "BMW, Mercedes, Audi" 的列表。
正在努力实现:
当我更换时:
<option value="BWM">BWM</option>
<option value="Mercedes">Mercedes</option>
<option value="Audi">Audi</option>
在下面的 HTML 代码片段中
{{ form.car_model_make }}
我得到"No results found"
和
<option> {{ form.car_model_make }} </option>
我得到了一个选项列表(BMW、Mercedes、Audi),但它们不可选
但是,
<option {{ form.car_model_make }} </option>
它有效,但我收到警告标签开始未关闭。如果我关闭标签,我会在下拉列表中打印标签字符“>”。
同样的结果产生于:<option value=" {{ form.car_model_make }} "></option>
我一头雾水,反复试验并没有给我想要的解决方案。我该怎么做?
<!DOCTYPE html>
<html>
<head>
<title>Bootstrap Example</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
</head>
<body>
<div class="container">
<div class="col-sm-12 mg-t-10 mg-sm-t-0">
<select class="form-control select2"
style="width: 100%;"
data-placeholder="Choose Car Make"
>
<option value="BWM">BWM</option>
<option value="Mercedes">Mercedes</option>
<option value="Audi">Audi</option>
</select>
</div>
</div>
</body>
</html>
似乎有两个步骤可以得到你要找的东西。
- 让 select 出现:
不是替换选项,而是将整个 select 替换为 {{ form.car_model_make }}
- 小部件的自定义格式:
仿照 Django 的 ModelForm documentation 你可以重载这个 widget 来自定义外观,类似于下面的东西:
widgets = {
'car_model_make': Select(attrs={
'class':"form-control select2",
'style':"width: 100%;",
'data-placeholder':"Choose Car Make"}),
}
目标是让下拉菜单正常工作。
将整个 Model / ModelForm 作为 {{ form }}
下面 html 代码片段是我的目标,但我想提供子集 {{ form.car_model_make }}
而不是 {{ form }}
并让 Django 自动创建所有选项 <option value="BWM">BMW</option>
...等等
# models.py
class Product(models.Models):
car_model_make = models.CharField(default='B', max_length=1, blank=True, choices=CAR_TYPE)
status_is_secondhand = models.BooleanField(blank=True)
# forms.py
class ProductForm(ModelForm):
class Meta:
model = Product
fields = ('__all__')
# views.py
class ProductFormView(FormView):
form_class = ProductForm
def form_valid(self, form):
form.save()
return super().form_valid(form)
def get_success_url(self):
return reverse('index')
# urls.py
urlpatterns = [
path('', index, name='index'),
path('product/', ProductFormView.as_view(template_name='product/product.html'), name='product'),
]
选项 CAR_TYPE 是一个包含 "BMW, Mercedes, Audi" 的列表。
正在努力实现:
当我更换时:
<option value="BWM">BWM</option>
<option value="Mercedes">Mercedes</option>
<option value="Audi">Audi</option>
在下面的 HTML 代码片段中
{{ form.car_model_make }}
我得到"No results found"
和
<option> {{ form.car_model_make }} </option>
我得到了一个选项列表(BMW、Mercedes、Audi),但它们不可选
但是,
<option {{ form.car_model_make }} </option>
它有效,但我收到警告标签开始未关闭。如果我关闭标签,我会在下拉列表中打印标签字符“>”。
同样的结果产生于:<option value=" {{ form.car_model_make }} "></option>
我一头雾水,反复试验并没有给我想要的解决方案。我该怎么做?
<!DOCTYPE html>
<html>
<head>
<title>Bootstrap Example</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
</head>
<body>
<div class="container">
<div class="col-sm-12 mg-t-10 mg-sm-t-0">
<select class="form-control select2"
style="width: 100%;"
data-placeholder="Choose Car Make"
>
<option value="BWM">BWM</option>
<option value="Mercedes">Mercedes</option>
<option value="Audi">Audi</option>
</select>
</div>
</div>
</body>
</html>
似乎有两个步骤可以得到你要找的东西。
- 让 select 出现:
不是替换选项,而是将整个 select 替换为 {{ form.car_model_make }}
- 小部件的自定义格式:
仿照 Django 的 ModelForm documentation 你可以重载这个 widget 来自定义外观,类似于下面的东西:
widgets = {
'car_model_make': Select(attrs={
'class':"form-control select2",
'style':"width: 100%;",
'data-placeholder':"Choose Car Make"}),
}