很抱歉这样一个蹩脚的问题,但是我无法在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>
请告诉我我的错误。
答案 0 :(得分:2)
根据这个问题:default value for django choice field
你必须做以下事情: https://stackoverflow.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()方法的输出吗?
这可能会澄清很多事情。
答案 1 :(得分:0)
所以,我找到了解决方案。事情是我正在传递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]