Django Передача пользовательских параметров формы в ModelFormset
-
06-07-2019 - |
Решение
Я думаю, что вы хотите внести некоторые изменения в свою пользовательскую фабричную функцию. Он должен возвращать класс formset, а не форму. Как насчет этого:
def make_vote_formset(game_obj, extra=0):
class _VoteForm(forms.ModelForm):
score = forms.ModelChoiceField(
queryset=Odds.objects.filter(game=game_obj),
widget=forms.RadioSelect(),
empty_label=None)
class Meta:
model = Vote
exclude = ['user',]
return modelformset_factory(Vote, form=_VoteForm, extra=extra)
Тогда, по вашему мнению, код:
current_game = Game.objects.filter(id=current_game_id)
VoteFormSet = make_vote_formset(current_game)
formset = VoteFormSet(
request.POST,
queryset=Vote.objects.filter(game__round=round, user=user))
Другие советы
Другое решение - создать подкласс BaseModelFormSet и переопределить метод _construct_forms . По умолчанию метод _Fstruct_form BaseFormSet вызывается в _construct_forms только с одним аргументом, i:
# django/forms/formsets.py
def _construct_forms(self):
# instantiate all the forms and put them in self.forms
self.forms = []
for i in xrange(self.total_form_count()):
self.forms.append(self._construct_form(i))
но может быть любое количество ключевых слов:
# django/forms/formsets.py
def _construct_form(self, i, **kwargs):
Итак, вот мой метод представления и форма, которые получают дополнительный параметр в init от _construct_form:
# view
def edit(request, id):
class ActionsFormSet(BaseModelFormSet):
department = request.user.userdata.department.pk
def _construct_forms(self):
self.forms = []
for i in range(self.total_form_count()):
self.forms.append(self._construct_form(i, dep=self.department))
actions_formset = modelformset_factory(Action, form=ActionForm, extra=0, can_delete=True, formset=ActionsFormSet)
...
# form
class ActionForm(forms.ModelForm):
def __init__(self, dep=0, *args, **kwargs):
super(ActionForm, self).__init__(*args, **kwargs)
self.fields['user'].choices = [(u.pk, u.first_name) for u in User.objects.filter(userdata__department=dep)]
class Meta:
model = Action
exclude = ('req',)
Не связан с StackOverflow