python - django 表单单选输入布局

标签 python django django-forms

解决这个问题的“djangoy”方法是什么:

在我的表单类中,我有一个 forms.ChoiceField,其小部件是一个 forms.RadioSelect 小部件,其中一个选项需要使用内联文本输入(这也是表单中的一个字段)来呈现。当未选择其单选选项时,我正在使用自定义验证来忽略文本字段。呈现后,我希望它显示如下:

<ul>
<li><label for="id_rad_0"><input type="radio" id="id_rad_0" value="none" name="rad" /> No Textbox</label></li>
<li><label for="id_rad_1"><input type="radio" id="id_rad_1" value="one" name="rad" /> One Textbox: <input type="text" name="bar" id="id_bar" /></label></li>
</ul>

但是,我不能简单地在我的模板中生成它,因为单选选项没有公开。如果不将我的表单与我的模板紧密耦合,或者将所有表示逻辑放在表单类中,我看不出有什么方法可以做到这一点。解决此问题的正确方法是什么?

编辑

我意识到上述问题可能只是一个晦涩难懂的问题,但我不确定我还能提供哪些其他信息来激励别人帮助我解决这个问题。我是一个比网页设计师更好的后端程序员,而且我一个人在做这个项目,所以也许是缺乏教育——我所描述的仅仅是糟糕的设计吗?我应该以不同的方式设计它吗?我真的很乐意接受这里的任何建议,以帮助我克服这个问题。

编辑2

根据请求,当前代码已缩短以保持理智,名称已更改以保护无辜者:

# forms.py
from myapp.models import RatherComplicatedModel
from django import forms

class RatherComplicatedForm(forms.ModelForm):
    #various and sundry code...
    RADIO_CHOICES = (
        ('none', "No Textbox"),
        ('one', "One Textbox: "),
    )
    # although I've abbreviated the model, 'rad' does not appear in the model;
    # it merely provides input to the un-provided clean function
    rad = forms.ChoiceField(widget=forms.RadioSelect(),choices=RADIO_CHOICES)

    class Meta:
        model = RatherComplicatedModel

-

# models.py
from django.db import models

class RatherComplicatedModel(models.Model):
    #some other stuff...
    bar = models.IntegerField(blank=True,null=True)

最佳答案

如果我正确理解你的问题,你可以访问模板中的选择元组:

<ul>
    {# Assuming {{ field }} here is {{ form.rad }} #}
    {% for choice in field.field.choices %}
    <li>
        <label for="id_{{ field.html_name }}_{{ forloop.counter0 }}">
            <input type="radio"
                id="id_{{ field.html_name }}_{{ forloop.counter0 }}"
                value="{{ choice.0 }}"
                name="{{ field.html_name }}" />
            {{ choice.1 }}
            {% if choice.0 == 'one' %}
                {# Necessary field here #}
                {{ form.bar }}
            {% else %}
                No Textbox
            {% endif %}
        </label>
    </li>
    {% endfor %}
</ul>

关于python - django 表单单选输入布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6218299/

相关文章:

python - 如何修复“"' str'对象没有属性 'META'”错误?

Windows 上的 Python - 编译

处理二进制文件的python性能

django - Docker-compose 服务退出,代码为 0

python - 模拟 Django 查询集以测试采用查询集的函数

django - 对于大量选择,ModelChoiceField有哪些替代方案?

django - 类型错误 : __init__() got an unexpected keyword argument 'show_preview'

python - django 中的表单验证

python - 在分配变量值之前使用的变量值仍然有效,这个 { k : v for k, v in ... } 语法是如何工作的?

python - 如何在不遇到 MemoryError 的情况下逐步将一个巨大的字节数组写入文件