关于 Django RadioSelect 初始值
Posted
技术标签:
【中文标题】关于 Django RadioSelect 初始值【英文标题】:About Django RadioSelect initial value 【发布时间】:2014-07-12 17:50:48 【问题描述】:很抱歉提出这样一个蹩脚的问题,但我无法为 ModelForm 中的字段设置初始值。它看起来像这样:
class OrderRegisterForm(forms.ModelForm):
class Meta:
model = Order
widgets =
'weight_units': forms.Radioselect,
在模型中:
class Order(models.Model):
WEIGHT_UNIT_CHOICES = (
('KG', 'kg'),
('TN', 't'),
)
weight_units = models.CharField(
max_length=2,
choices=WEIGHT_UNIT_CHOICES,
default="KG"
)
但后来我试图在这样的模板中呈现它
<ul class="form__row__list">
order_form.weight_units
</ul>
出现正确的值,但未选择具有默认值的单选按钮。我尝试传递一个初始参数,在表单中覆盖__init__
等等,但仍然没有任何效果。
更新
as_p() 提供了正确的结果。事情变得越来越奇怪了。
<p>
<label for="id_weight_units_0">Weight units:</label>
<ul id="id_weight_units">
<li>
<label for="id_weight_units_0"><input checked="checked" id="id_weight_units_0" name="weight_units" type="radio" value="KG" /> kg</label>
</li>
<li>
<label for="id_weight_units_1"><input id="id_weight_units_1" name="weight_units" type="radio" value="TN" /> t</label>
</li>
</ul>
请告诉我我的错误。
【问题讨论】:
你有没有按照这个问题尝试过一切:***.com/questions/604266/… 【参考方案1】:根据这里的这个问题:default value for django choice field
您必须执行以下操作: https://***.com/a/22257696/659900
使用默认属性:
display = models.CharField(..., default=FRIENDS)
或
display = models.CharField(..., default=CHOICES[1][1])
* 更新 *
我已获取您的代码,并尝试重现您的错误。但不幸的是,您的代码确实有效。
这就是我所做的
models.py
class Order(models.Model):
WEIGHT_UNIT_CHOICES = (
('KG', 'kg'),
('TN', 't'),
)
weight_units = models.CharField(
max_length=2,
choices=WEIGHT_UNIT_CHOICES,
default="TN"
)
forms.py
class OrderRegisterForm(ModelForm):
class Meta:
model = Order
widgets =
'weight_units': RadioSelect,
我已经使用 shell 查看生成了哪些 html:
>> from playground.test_app.forms import OrderRegisterForm
>> o = OrderRegisterForm()
>> o.as_p()
这给了我以下输出(为清晰起见而格式化):
<p>
<label for="id_weight_units_0">Weight units:</label>
<ul>\n
<li>
<label for="id_weight_units_0">
<input type="radio" id="id_weight_units_0" value="KG" name="weight_units" />
kg</label>
</li>\n
<li>
<label for="id_weight_units_1">
<input checked="checked" type="radio" id="id_weight_units_1" value="TN" name="
weight_units" />
t</label>
</li>\n
</ul>
</p>
我故意将默认设置为“TN”,以确保 django 不会意外使用第一个元素。查看checked="checked"
属性,Django 实际上确实使用了正确的默认值。您是否有一些有趣的 javascript 可能会改变您的输出?
那么您能否提供您的 .as_p() 方法的输出?
这可能会澄清很多事情。
【讨论】:
我在用,看提供的代码。它只是不起作用。 as_p() 提供了正确的结果,但简单的 order_form.weight_units 没有。更新了我的问题。顺便说一下,Django 版本是 1.6.5。【参考方案2】:所以,我找到了解决方案。问题是我将 request.GET 原样传递给表单构造函数,它似乎完全覆盖了字段的初始值。所以,如果你这样做
f = Form(request.GET)
出现上述问题。为避免这种情况,可能的正确代码是:
if request.method == "GET":
form = Form()
for key in request.GET:
if key in form.fields:
form.fields[key].initial = request.GET[key]
【讨论】:
我只是想问您是否可以发布您的views.py :-) 无论如何,请不要这样做。如果您盲目地使用 GET 值,任何人都可以将内容传递到您的表单中。如果您接受表单的“GET”值,请清理您的输入以上是关于关于 Django RadioSelect 初始值的主要内容,如果未能解决你的问题,请参考以下文章
如何将 CSS 类添加到 django RadioSelect 标签?
在新版本的Django中,`forms.RadioSelect.renderer`的替代方案是什么?
将 CSS 类添加到 django RadioSelect 标签
使用包含 RadioSelect 小部件的 ModelChoiceField 在 ModelForm 的查询集中获取 request.user