Как добавить дополнительный контекст в виджет формы Django - PullRequest
0 голосов
/ 26 июня 2019

базовый виджет Django CheckboxSelectMultiple позволяет передавать label и value в шаблон.Я хочу добавить 2 дополнительных поля из модели, но не могу понять, каким образом, хотя я полагаю, что это происходит через подклассы get_context

У меня есть эта модель, и я хотел бы включить icon и description в виджете

class AddOnItem(models.Model):
    name = models.CharField(
        verbose_name = 'AddOn Title',
        max_length = 50
    )
    description = models.CharField(
        verbose_name = 'Description',
        max_length = 255
    )
    icon = models.FileField(upload_to="addon_icons/", blank=True, null=True)
    active = models.BooleanField(default=False)

В моей форме я определил этот виджет

class JobPostWizardForm1(forms.ModelForm):
    class Meta:
        model = Job
        fields = [
            ...,
            'addons'
            ]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        ...

        self.fields['addons'].widget = AddOnCheckboxSelectMultiple()
        self.fields['addons'].queryset = AddOnItem.objects.filter(active=True)

И я выделил подкласс CheckboxSelectMultiple как

class AddOnCheckboxSelectMultiple(forms.CheckboxSelectMultiple):
    template_name = 'jobboard/widgets/addon_checkbox_select.html'
    option_template_name = 'jobboard/widgets/addon_checkbox_option.html'

    def get_context(self, name, value, attrs):
        context = super().get_context(name, value,attrs)
        return context

Очевидно, что в данный момент это ничего не делает, но я хочу добавить что-то вроде

context['icon'] = obj.icon

, но я не могу понять, как это сделать.То есть я не слежу за тем, как виджеты Django получают объект.

Буду очень признателен за любую доступную помощь - спасибо

1 Ответ

0 голосов
/ 29 июня 2019

Возможно, это не лучшее решение, но оно работает.

Я подкласс create_option вроде так:

def create_option(self, name, value, label, selected, index, subindex=None, attrs=None):
    ctx = super().create_option(name, value, label, selected, index, subindex=subindex, attrs=attrs)
    obj = AddOnItem.objects.get(id=int(value))
    ctx['icon'] = obj.icon
    ctx['description'] = obj.description
    ctx['price'] = obj.price

    return ctx

Затем я могу получить эти атрибуты с помощью {{ widget.field_name }} в шаблоне

...