Django: как получить доступ к экземпляру набора запросов внутри макета FormHelper
Я использую форму для обновления списка свойств ингредиентов.
IngredientFormSet = modelformset_factory(Ingredient, form=IngredientForm, extra=0)
formset = IngredientFormSet(queryset=ingredients_dictinct)
# I am passing a list of ingredients as queryset
helper = RecipeIngredientFormSetHelper()
Мой код помощника формы:
class RecipeIngredientFormSetHelper(FormHelper):
def __init__(self, *args, **kwargs):
super(RecipeIngredientFormSetHelper, self).__init__(*args, **kwargs)
self.form_method = 'post'
self.layout = Layout(
Div(
Div(HTML("{{ forloop.counter }}"),
css_class='col-xs-2', style='text-align:center'),
Div('name', css_class='col-xs-2',),
Div('munit', css_class='col-xs-2',),
Div('rate', css_class='col-xs-2',),
Div('typeofingredient', css_class='col-xs-2',),
Div('density_kg_per_lt', css_class='col-xs-2',),
Div('density_pcs_per_kg', css_class='col-xs-1',),
Div('density_pcs_per_lt', css_class='col-xs-1',),
css_class='row',style="border-top:1px solid;padding-top:20px")
)
self.add_input(Submit("submit", "Save"))
self.render_required_fields = True
В self.layout с использованием HTML(), как показать некоторые свойства объекта ингредиента
Как получить доступ к ингредиенту, переданному в наборе запросов внутри макета
Например:
self.layout = Layout(
Div(
Div(HTML("{{ forloop.counter }}"),
HTML("{{ ingredient.somemodelmethod }}"),
css_class='col-xs-2', style='text-align:center'),
1 ответ
Я боролся с той же проблемой. Решением, которое я реализовал, было создание поля, которое отображает его значение в виде простого текста.
Добавить поле формы plain_text в форму модели
Реализуйте пользовательский виджет для визуализации ввода текста в виде простого текста
Установите значение поля plain_text внутри формы init
Используйте поле plain_text в FormHelper вместо HTML
from django.utils.safestring import mark_safe class PlainTextWidget(forms.Widget): def render(self, name, value, attrs=None): return mark_safe(value) if value is not None else '-' class IngredientForm(forms.ModelForm): plain_text = forms.CharField(widget=PlainTextWidget,required=False) .... def __init__(self, *args, **kwargs): super(IngredientForm, self).__init__(*args, **kwargs) self.initial['plain_text'] = self.instance.somemodelmethod() self.layout = Layout( Div( Div( HTML("{{ forloop.counter }}"), Field('plain_text'),