2012-01-27 2 views
0

Все,Инициализация modelformset с manytomanyfield

Я пытаюсь инициализировать modelformset с помощью manytomanyfield. Уловка заключается в том, что я не знаю заранее имя многоголовочного поля (и того класса, к которому он привязан).

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

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) и класс formet (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) 

Но я не знаю, правильные условия, чтобы положить в фильтр.

Любые предложения?

ответ

0

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

В теории это правильный способ делать вещи, так как Даниэль говорит:

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()) 

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

1

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

book.authors запрос «авторов, для которых имеется m2m из этой книги». Таким образом, это совершенно верно для перехода в init.

formset = AuthorFormset(queryset=m2m_field.all()) 
+0

Спасибо. Однако все не так хорошо работает. Притворимся, что у меня есть книга с автором «Шекспира». Если мое представление использует _that_ book, то 'formet = AuthorFormset (queryset = book.authors.all())', кажется, работает нормально (он завершает показ формы с одной формой, содержащей детали Шекспира). Но, если мой взгляд использует новую модель, тогда набор форм должен быть пустым. Однако 'formet = AuthorFormset()' также завершает показ формы с деталями Шекспира, а не пустую форму, как я ожидал. – trubliphone

Смежные вопросы