Расширение класса `Field` в Django - PullRequest
1 голос
/ 27 мая 2020

Весь мой поиск дал результаты для «настраиваемых полей» в Django, что не то, что мне нужно, я пытаюсь настроить класс Field. Единственный аналогичный вопрос не получил ответа.


Я создаю форму в Django, и я пытаюсь указать конкретный значок c появляться рядом с каждым полем ввода. ( См. Макет )

Например, я добавил нестандартный аргумент icon при построении формы:

checkin.py

from django import forms

class CheckInForm(forms.Form):
    last_name = forms.CharField(
        icon="fa-id-card-o"
    )
    dob = forms.DateField(
        icon="fa-calendar"
    )
    ...

Я хотел бы получить доступ к этому новому аргументу icon из моего шаблона:

checkin.html

<form action="" method="post">
    {% csrf_token %}
    <table>
        {% for field in form %}
            <label for="{{ field.name }}" class="col-4 col-form-label">
                {{ field.label }}
            </label>
            <div class="col-8">
                <div class="input-group">
                    <div class="input-group-prepend">
                        <div class="input-group-text">
                            <i class="fa {{ field.icon }}"></i>   <!--- icon argument --->
                        </div>
                    </div>
                    {{ field }}
                </div>
            </div>
        {% endfor %}
    </table>
    <div class="form-group row">
        <div class="offset-4 col-8">
            <button name="submit" type="submit" class="btn btn-primary">Check In</button>
        </div>
    </div>
</form>

Когда я запускаю этот код, он Конечно, происходит сбой:

TypeError: init () получил неожиданный аргумент ключевого слова 'icon'

Попытка подхода

Это мне кажется, это хороший случай для расширения некоторых Python классов .

Оба CharField и DateField являются подклассами Django s Field class , поэтому я подумал, что могу расширить его примерно так:

from django.forms import Field

class ExtendedField(Field):
    icon = ""

Но вот где я застрял: как мне развернуть этот новый класс? Мой объект CheckInForm является подклассом forms.Form, который является подклассом BaseForm, который, похоже, не создает никаких объектов Field напрямую, поэтому я не уверен, как они связаны. Однако класс Field - это , который сотни раз использовался в других местах. Должен ли я переопределить их все?

tl; dr : Есть ли более простой способ применить это простое изменение в классе Field во всех местах, где оно используется?

1 Ответ

0 голосов
/ 27 мая 2020

Довольно грязное, но простое решение:

from django import forms

class CustomCharField(forms.CharField):
    def __init__(self, *_, **kwargs):
        self.icon = kwargs.pop('icon', None)
        super().__init__(
            **kwargs
        )


class MyForm(forms.Form):
    title = CustomCharField(icon='dad', max_length=10)

В шаблоне получить доступ по:

{{ form.title.field.icon}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...