Django Model Formset из ManyToMany не принимает набор запросов
У меня есть модель под названием Game, которая имеет поле ManyToMany
consoles = models.ManyToManyField('Console', through='GameConsole')
Что ManyToMany имеет некоторые дополнительные атрибуты
class GameConsole(models.Model):
game = models.ForeignKey(Game, on_delete=models.CASCADE)
console = models.ForeignKey(Console, on_delete=models.CASCADE)
released = models.DateTimeField
exclusive = models.BooleanField(default=False)
У меня есть страница, на которой я хочу создавать/редактировать эти отношения.
#forms.py
class GameConsoleForm(ModelForm):
class Meta:
model = GameConsole
fields = ['console', 'released', 'exclusive']
#to prevent the submission of consoles with the same id (taken from django topics forms formsets)
class BaseGameConsoleFormSet(BaseFormSet):
def clean(self):
"""Checks that no two alias have the same name."""
if any(self.errors):
# Don't bother validating the formset unless each form is valid on its own
return
console_ids = []
for form in self.forms:
if self.can_delete and self._should_delete_form(form):
continue
console= form.cleaned_data.get('console')
if console in console_ids:
raise ValidationError("Consoles in a set must be different.")
console_ids.append(console)
NewGameConsoleFormSet = modelformset_factory(GameConsole, form=GameConsoleForm, formset=BaseGameConsoleFormSet, extra=1, can_delete=True)
GameConsoleFormSet = modelformset_factory(GameConsole, form=GameConsoleForm, formset=BaseGameConsoleFormSet, extra=0, can_delete=True)
Создание нескольких GameConsole работает нормально. Проблема заключается в редактировании.
Когда я делаю следующее: formset = GameConsoleFormSet(queryset = game_consoles)
я получаю следующую ошибку __init__() got an unexpected keyword argument 'queryset'
, что странно, так как я уже использовал эту логику с другой моделью (обычная таблица, не ManyToMany) и она работала.
Мой вопрос заключается в следующем: я делаю что-то неправильно, или набор форм модели ManyToMany не поддерживает кверисет для редактирования?
Вам нужно наследовать BaseModelFormSet
класс вместо BaseFormSet
так:
class BaseGameConsoleFormSet(BaseModelFormSet):
...