Настройки виджетов Django и атрибуты переменных

Попытка включить переменные в качестве атрибутов и значений в поле формы в шаблоне приложения Django через partial/component.

Здесь есть несколько связанная тема , но, насколько я понимаю, она охватывает одну сторону проблемы, с которой я сталкиваюсь при использовании django-widget-tweaks и пользовательских тегов

В моем случае я хочу не только присвоить динамическое значение предопределенному атрибуту (что я могу сделать с помощью дополнительных тегов шаблона, как описано, например, здесь), но сначала динамически создать атрибут и присвоить ему значение для htmx-запросов, таких как hx-get или hx-post.

Including partials ведет себя как ожидалось, если я указываю тип htmx запроса непосредственно в render_field и передаю значение (в данном случае URL) через include, а также когда я добавляю атрибут и жестко кодирую его значение с помощью |attr:, например так:

{% include "partials/input-text.html" with field=form.email|attr:"hx-post:/search/" %}

Я попытался применить append_attr вновь созданный атрибут, но вижу AttributeError: 'SafeString' object has no attribute 'as_widget', а также чувствую, что упускаю суть.

В идеале, я хочу иметь возможность передавать атрибут &value как переменные (может быть через пользовательские теги шаблона), по типу {% include "partials/input-text.html" with field|attr:"{{hxaction}}:{{hxurl}}" %}

Все, что я читал о том, как делать такие сложные шаблонные вещи, как эта, всегда есть люди, которые говорят, что это не то, для чего созданы шаблоны django... Поэтому вы должны стараться иметь как можно больше логики в бэкенде и не в шаблоне...

и для этого я бы сказал, что вам следует расширить Form.py

Базовые атрибуты (forms.py)

class TheForm(forms.ModelForm):
    class Meta:
        model = The
        fields = (
            'email',
            )

    def __init__(self,  *args, **kwargs):
        super(TheForm, self).__init__(*args, **kwargs)
        self.fields['email'].widget.attrs={'class': 'form-control', 'hx-post':'/search/'}

Больше динамических атрибутов (forms.py)

  • Передача дополнительных kwargs в форму
class TheForm(forms.ModelForm):
    class Meta:
        model = The
        fields = (
            'email',
            )

    # helper
    def ValOrDefault(self, key, default_value):
        if self.extra and key in self.extra:
            return self.extra[key]
        return default_value

    def __init__(self,  *args, **kwargs):
        self.extra =  kwargs['extra'] if 'extra' in kwargs else None
        super(TheForm, self).__init__(*args, **kwargs)
        self.fields['email'].widget.attrs={
            'class': 'form-control',
            'hx-post': ValOrDefault('email_hx-post', '/search/'),
        };

Больше динамических атрибутов (view.py)

extraDict = {
    'email_hx-post': '/sendmail/{0}'.format(obj.email),
    # more attributes, different fields
}

form = TheForm(extra=extraDict)

Сейчас, безусловно, есть более умные способы, которыми вы могли бы сделать динамику... Это просто в целом то, что я бы сделал с моим текущим пониманием, возможно, было бы больше вспомогательных функций

Вернуться на верх