Django 在每行中使用单选按钮呈现窗体的推荐方法

Django 在每行中使用单选按钮呈现窗体的推荐方法,django,python-3.x,django-models,django-forms,django-templates,Django,Python 3.x,Django Models,Django Forms,Django Templates,我想用一个表构建一个表单,其中每行包含一个单选按钮和一些附加信息 假设我有两个相关的模型: class City(models.Model): name = models.CharField(...) state = models.CharField(...) class Business(models.Model): city = models.ForeignKey(City, on_delete=models.CASCADE, null=True) 我想创建一个表

我想用一个表构建一个表单,其中每行包含一个单选按钮和一些附加信息

假设我有两个相关的模型:

class City(models.Model):
    name = models.CharField(...)
    state = models.CharField(...)

class Business(models.Model):
    city = models.ForeignKey(City, on_delete=models.CASCADE, null=True)
我想创建一个表格,显示
城市
模型中的所有行,第一列中有一个单选按钮,保存为
业务
模型实例中的
城市
字段。表中的其他列不应可编辑。表中的每一行看起来如下所示:

<tr>
 <td>
  <input type="radio" name="city_radio"/>
 </td>
 <td>CITY NAME HERE</td>
 <td>CITY STATE HERE</td>
</tr>
并在模板中使用它,如下所示:

{% for form in cities_formset %}
<tr>
 <td>
  {{ form.city_radio }}
 </td>
 <td>{{ city.instance.name }}</td>
 <td>{{ city.instance.state }}</td>
</tr>
{% endfor %}
但问题是:如何在我的表列中插入
City
模型中的
name
state
字段


对于这种情况,推荐的解决方案是什么?有没有可能修正我的任何方法,使它们按预期工作?

事实上,您的类BusinessForm是正确的,您甚至不需要在那里初始化。当您调用Meta时,在模板中的表单迭代期间,您将获得OrderedDict,其中包含来自声明字段的键和ModelChoiceField的值

假设您使用render()方法将BusinessForm发送到html中:

视图.py

from django.shortcut import render
from .forms import BusinessForm

def dummy_method(request):
    template_name = 'dummy_app/dummy.html'
    content = {
        'form': BusinessForm()
    }
    return render(request, template_name, content)
(...)
def __str__(self):
    return '{} - {}'.format(self.name, self.state)
然后在HTML中,您几乎没有选择如何处理它。 首先,您可以迭代声明的字段并查看django的魔力。


如果您想控制城市实例,可以迭代ModelChoiceFields

<form>
<table>
{% for single_city in form.city.field.queryset %}
        <tr>
            <td><input id="{{single_city.id}}" type="radio"/></td>
            <td>{{single_city.name}}</td>
            <td>{{single_city.state}}</td>
        </tr>
{% endfor %}
</table>
</form>

{%form.city.field.queryset%}
{{single_city.name}
{{single_city.state}}
{%endfor%}
但在这种情况下,您必须自己定义单选按钮。你在这里有无限的控制权,在大多数情况下,我在工作中都会这样做


还可以创建您自己的自定义类,该类继承自RadioSelect。 也不要忘记{form.as_table}的平凡解决方案

我希望这些建议能对你有所帮助。也许他们会告诉你其他的方法,如何处理这件事


祝你好运。

事实上你的班级商业模式是正确的,你甚至不需要在那里初始化。当您调用Meta时,在模板中的表单迭代期间,您将获得OrderedDict,其中包含来自声明字段的键和ModelChoiceField的值

假设您使用render()方法将BusinessForm发送到html中:

视图.py

from django.shortcut import render
from .forms import BusinessForm

def dummy_method(request):
    template_name = 'dummy_app/dummy.html'
    content = {
        'form': BusinessForm()
    }
    return render(request, template_name, content)
(...)
def __str__(self):
    return '{} - {}'.format(self.name, self.state)
然后在HTML中,您几乎没有选择如何处理它。 首先,您可以迭代声明的字段并查看django的魔力。


如果您想控制城市实例,可以迭代ModelChoiceFields

<form>
<table>
{% for single_city in form.city.field.queryset %}
        <tr>
            <td><input id="{{single_city.id}}" type="radio"/></td>
            <td>{{single_city.name}}</td>
            <td>{{single_city.state}}</td>
        </tr>
{% endfor %}
</table>
</form>

{%form.city.field.queryset%}
{{single_city.name}
{{single_city.state}}
{%endfor%}
但在这种情况下,您必须自己定义单选按钮。你在这里有无限的控制权,在大多数情况下,我在工作中都会这样做


还可以创建您自己的自定义类,该类继承自RadioSelect。 也不要忘记{form.as_table}的平凡解决方案

我希望这些建议能对你有所帮助。也许他们会告诉你其他的方法,如何处理这件事


祝你好运。

非常感谢。通过覆盖
add_prefix
方法,我几乎获得了第一种工作方法,但是每个无线电
id
也都是一样的。我不知道您可以使用
.field.queryset
访问queryset。非常感谢。通过覆盖
add_prefix
方法,我几乎获得了第一种工作方法,但是每个无线电
id
也都是一样的。我不知道您可以使用
.field.queryset
访问queryset。