инициализировать модельформсети с помощью множества полей - PullRequest
0 голосов
/ 27 января 2012

Все,

Я пытаюсь инициализировать набор модели с множеством полей.Загвоздка в том, что я заранее не знаю ни имени поля многоборья (ни класса, с которым оно связано).

Вот мои модели и формы:

class Book_model(models.Model):
    title = models.CharField(max_length=BIG_STRING)
    authors = models.ManyToManyField("Author_model",)

class Author_model(models.Model):
    name = models.CharField(max_length=BIG_STRING)

class Book_form(ModelForm):
    class Meta:
        model = Book_model

class Author_form(ModelForm:
    class Meta:
        model = Author_model

Author_formset = modelformset_factory(Author_model,form=Author_form)

И еще где-то вмой код, который я пытаюсь отобразить Model_form вместе с Author_formset.Когда приходит время инициализировать этот набор форм, я не уверен, что делать.В этот момент я знаю имя поля m2m («авторы»), экземпляр родительской модели (Book_model), экземпляр родительской формы (Book_form) и класс formset (Author_formset).Я предполагаю, что мне просто нужно сделать что-то вроде этого:

m2m_field = getattr(book,"authors")
qset = field.filter(<only authors for which there is a m2m relationship from this book>)
formset = Author_formset(queryset=qset)

Но я не знаю правильных терминов для включения в фильтр.

Есть предложения?

Ответы [ 2 ]

1 голос
/ 27 января 2012

Вы на правильном пути.

book.authors - это набор запросов "авторов, для которых есть м2м из этой книги". Так что это вполне допустимо для перехода в initset.

formset = AuthorFormset(queryset=m2m_field.all())
0 голосов
/ 28 января 2012

Я думаю Я решил это.

Теоретически это правильный путь, как предлагает Даниэль:

formset = Author_formset(queryset=book.authors.all())

Но я не могу сделать это напрямую, потому что я пойман в ловушку некоторого общего кода, которыйтребуется для любая модель / форма / форма.Поэтому я вынужден сделать это вместо этого:

 # these 4 lines are just for clarity's sake
 # I don't actually know what these map to in my code
 MyModelClass = Book_model
 MyFormClass = Book_form
 MyFormSetClass = Author_formset
 fieldName = "authors"

 def DoStuff(model_id=None):
   if (model_id):
     model = MyModelClass.objects.get(pk=model_id)
   else:
     model = MyModelClass()

   form = MyFormClass(instance=model)

   if model.pk:
     m2mModels = getattr(model,fieldName)
     formset = MyFormSetClass(queryset = m2mModels.all())
   else:
     m2mModelClass = MyFormSetClass.form.Meta.model
     formset = MyFormSetClass(queryset = m2mModelClass.objects.none())

Это кажется немного уродливым, но это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...