Используя представление на основе класса (generics.FormView), как добавить kwargs формы каждый раз, когда используется представление?

У меня есть модель app/models.py:

from django.db import models

class MyModel(models.Model):
     my_field = models.Charfield(max_length=100, blank=True, null=True)

У меня есть форма в app/forms.py:

from django import forms

class MyForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        custom_data = kwargs.pop('custom_field', None)
        super().__init__(*args, **kwargs)

    class Meta:
        fields = ['my_field']

А у меня CBV в app/views.py:

from django.views import generic
from .forms import MyForm

class MyFormView(generic.FormView):
    template_name = 'my_form_template.html'
    form_class = MyForm

В принципе, я хочу иметь возможность добавлять некоторые пользовательские поля из моей абстрактной модели User, которые требуются форме. Я не хочу иметь какие-то безумные переопределения контекста, я просто хочу, чтобы форма всегда имела дополнительные данные при инициализации.

Есть идеи?

если вы хотите добавить некоторую информацию в форму, вы можете использовать EditView.get_initial().

Это словарь.

def get_initial(self, *args, **kwargs):
    return super().get_initial(*args, **kwargs) | {'custom_data': self.kwargs.get('custom_field')}

после init везде можно использовать этот начальный дикт:

 form.initial['custom_data']

Вам не нужно переопределять форму __init__ или get_form_kwargs e.t.c.

Самый простой подход Django - переопределить get_form_kwargs:

class MyView(FormView):
    def get_form_kwargs(self) -> Dict:
        kwargs = super().get_form_kwargs()
        kwargs["request"] = self.request
        return kwargs

Помните, что вам нужно pop разместить ее в __init__() форме, прежде чем вызывать ее super().

Удачи!

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