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 ответ

Я боролся с той же проблемой. Решением, которое я реализовал, было создание поля, которое отображает его значение в виде простого текста.

  1. Добавить поле формы plain_text в форму модели

  2. Реализуйте пользовательский виджет для визуализации ввода текста в виде простого текста

  3. Установите значение поля plain_text внутри формы init

  4. Используйте поле 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'),
    
Другие вопросы по тегам