Используя представление на основе класса (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()
.
Удачи!