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。