【问题标题】:Django CheckBox Form Item using choices not true / false (Boolean)使用非真/假选择的 Django CheckBox 表单项(布尔值)
【发布时间】:2015-07-23 07:39:53
【问题描述】:

这让我发疯了,希望有人能指出我改变这一点的正确方向。我的模型中有一个布尔项目,但是当我创建我的表单时,它提供了一个带有“未知”、“是”和“否”的选择选项。我认为它会默认为“True”和“False”,因此需要相应地更改它。我最初的想法是使用小部件(就像我设置 Textarea 所做的那样,但似乎找不到模型或小部件 .boolean 选项。如果有人能引导我正确,我会非常感激 :)

下面的代码以防万一,我只有 2 个月的时间来学习 Django / Python(在我的业余时间,这对 4 个月大的孩子来说并不多)所以代码可能不如有经验丰富。

提前致谢:)

型号

class Announcement(models.Model):
    announcement_title = models.CharField(max_length=75, verbose_name="Announcement Title")
    announcement_text = models.CharField(max_length=500, verbose_name="Announcement Text")
    announcement_active = models.BooleanField(default=True, verbose_name="Announcement Active")
    announcement_date = models.DateField(default=date.today, verbose_name="Announcement Date")
    announcement_high = models.BooleanField(default=True, verbose_name="Announcement Alert Severity")
    announcement_expiry = models.DateField(null=True, verbose_name="Announcement Expiry")

    def __str__(self):
        return self.announcement_text

表格

class AnnouncementForm(ModelForm):
    class Meta:
        model = Announcement
        exclude = ('announcement_date', 'announcement_active', )
        help_texts = {
            'announcement_title': _('Enter a title to give the announcement.'),
            'announcement_text': _('Type the announcement body in this box.'),
            'announcement_expiry': _('Can specify a date to stop displaying the announcement. Can be left blank.'),
            'announcement_high': _('Tick this box to indicate a red severity, un-ticked will make it yellow.'),
        }
        widgets = {
            'announcement_title': forms.TextInput(attrs={'class': 'form-control'}),
            'announcement_text': forms.Textarea(attrs={'class': 'form-control', 'cols': 80, 'rows': 10}),
            'announcement_expiry': widgets.DateInput(attrs={'class' : 'datepicker'}),
        }

查看

相当大,所以不确定是否需要。有需要可以发帖。

模板

<form action="/siteadmin/{{ branding.dataset }}" method="POST" class="form-horizontal">
    {% csrf_token %}
    {% for item in form %}
    <div class="form-group">
        <div class="col-sm-4 control-label">
        {% if item.help_text %}
            <img src="/static/images/info.png" height="20" width="20" aria-hidden="true" data-toggle="popover" title="{{ item.help_text }}">&nbsp
        {% endif %}
            {{ item.label_tag }}
        </div>
        <div class="col-sm-7">
            {{ item }}
        </div>
        <div class="col-sm-1">
        </div>
    </div>
    {% endfor %}
    <div class="form-group">    
        <div class="col-sm-11">
            <input class="btn btn-primary pull-right" type="submit" value="Add" />
        </div>
        <div class="col-sm-1">
        </div>
    </div>  
</form>

【问题讨论】:

  • 这发生在哪个BooleanField 上?您最近是否对模型进行过更改(是否需要迁移)?
  • 抱歉,说得好。它的公告_high。我确实有一些我未能申请但不适用于该表的迁移。我现在已经制作并迁移了,POST 数据仍然显示 'announcement_high' u'on'
  • 如果结果正确,我很乐意将其添加为答案,但我不确定.. BooleanField state 的文档“如果您想在表单中包含布尔值可以是 True 或 False(例如选中或未选中的复选框),您必须记住在创建 BooleanField 时传入 required=False。"
  • 在我的模型中添加了 required=False 并运行了 makemigrations; “__init__() 得到了一个意外的关键字参数‘必需’”
  • 什么版本的django?你能用你试过的代码更新你的问题吗

标签: django forms


【解决方案1】:

我不确定您所说的没有小部件选项是什么意思。您可以像为任何其他字段一样为布尔字段定义小部件:在表单定义中。

class AnnouncementForm(ModelForm):
    class Meta:
        model = Announcement
        ...
        widgets = {
            'announcement_title': forms.TextInput(attrs={'class': 'form-control'}),
            'announcement_text': forms.Textarea(attrs={'class': 'form-control', 'cols': 80, 'rows': 10}),
            'announcement_expiry': widgets.DateInput(attrs={'class' : 'datepicker'}),
            'announcement_high': forms.CheckboxInput()
        }

【讨论】:

  • 试过但得到;异常值:'module'对象没有属性'CheckboxInput'
  • 我从表单中返回的 POST 数据显示;公告_high u'on',而不是true。这意味着 form.is_valid() 失败并抛出异常。这是我目前正在努力克服的问题。 IRC 上有人建议使用 CBV,但我想了解这个问题,然后 CBV 是我正在阅读的学习 Django 的书的下一章。
  • 但这就是您使用表单而不是访问原始 POST 数据的原因。 form.cleaned_data['announcement_high'] 将是 True 或 False。
  • 嗨@daniel-roseman。感谢您的持续回复。我相信你过去曾回复过我,谢谢。我并没有真正尝试访问原始数据,我只是想解决 form.is_valid() 失败的原因,并假设这是因为该字段正在返回。我必须承认,不确定 form.clean_data 是做什么的,我会在午餐时去阅读它。
猜你喜欢
  • 2013-12-09
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 2019-01-06
  • 2015-04-02
  • 2020-01-05
  • 2021-05-29
  • 2012-07-10
相关资源
最近更新 更多