关于 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 初始值的主要内容,如果未能解决你的问题,请参考以下文章

Django RadioSelect 模型中的选择

如何将 CSS 类添加到 django RadioSelect 标签?

在新版本的Django中,`forms.RadioSelect.renderer`的替代方案是什么?

将 CSS 类添加到 django RadioSelect 标签

使用包含 RadioSelect 小部件的 ModelChoiceField 在 ModelForm 的查询集中获取 request.user

如何在 Django 数据库中保存用户评分?