关于Django RadioSelect的初始值

时间:2014-05-23 11:30:13

标签: python django

很抱歉这样一个蹩脚的问题,但是我无法在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>

请告诉我我的错误。

2 个答案:

答案 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]