【发布时间】:2018-08-26 18:36:07
【问题描述】:
背景
我有两个模型,Runs 和 Orders。一次运行将完成许多订单,因此我的订单和运行之间存在多对一关系,表示为订单上的外键。
我想构建一个 UI 来创建运行。它应该是有人选择要运行的订单的形式。我想在每个订单的信息旁边显示一个复选框列表。我现在正在使用django crispy forms。
views.py
class createRunView(LoginRequiredMixin, CreateView):
model = Run
form_class = CreateRunForm
template_name = 'runs/create_run.html'
forms.py
class CreateRunForm(forms.ModelForm):
class Meta:
model = Run
fields = ['orders',]
orders = forms.ModelMultipleChoiceField(queryset=Order.objects.filter(is_active=True, is_loaded=False))
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_method = 'post'
self.helper.layout = Layout(
Field('orders', template="runs/list_orders.html"),
Submit('save', 'Create Run'),
Button('cancel', 'Cancel'),
)
问题
我不确定在
list_orders.html模板中可以使用哪些本地人。似乎有{{ field }}和form.visible_fields,但如果我深入了解其中一个,我会得到一个TypeError: 'SubWidget' object is not iterable,几乎没有在线记录。-
以上表明我可能仍然会在模板中获得一个小部件,尽管
Field('orders', template="runs/list_orders.html"),应该阻止这种情况,根据crispy docs:Field:非常有用的布局对象。您可以使用它来设置字段中的属性或使用自定义模板呈现特定字段。这样你就避免了显式覆盖字段的小部件并传递一个丑陋的 attrs 字典:
我见过this answer,它建议使用
label_from_instance。但是我不确定如何将一堆 html 塞入label_from_instance。我真的想要一个模板来生成一堆显示整个订单对象详细信息的 html,而不是使用不同的标签,所以我不确定这种方法是否有效。this question 中的答案大部分让我感到困惑,但似乎接受的答案不起作用。 (可能是 django 版本问题,还是脆皮表单问题?)
TL;DR
如何使用 ModelMultipleChoiceField 中每个模型的数据呈现模板?
【问题讨论】:
-
您是否尝试过使用自定义小部件@AlexLenail? stackoverflow.com/questions/44675550/…
标签: python django django-forms django-crispy-forms