2012-01-27 2 views
0

모두모델 토폴로지를 manytomanyfield로 초기화하십시오.

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) 

그리고 다른 곳에서 내 코드에서 내가 Author_formset와 함께 Model_form를 표시하려고 : 여기

내 모델과 형태이다. 그러나, 그 formset을 초기화 할 시간이 왔을 때, 나는 무엇을 해야할지 잘 모르겠습니다. 이 시점에서 m2m 필드의 이름 ("authors"), 상위 모델 인스턴스 (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) 

그러나 필터에 넣기에 적합한 용어를 모르겠습니다.

제안 사항?

답변

0

나는이 문제를 해결 한 생각 .

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

을하지만 어떤을 위해 호출 할 수있는 몇 가지 일반적인 코드에 갇혀이기 때문에 내가 직접 할 수 없어 : 다니엘 알 수 있듯이 이론적으로

이, 일을하는 올바른 방법입니다 모델/양식/formset. 따라서 대신 다음을 수행해야합니다.

# 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이있는 저자"의 쿼리 세트입니다. 그래서 formset init에 전달하는 것이 타당합니다.

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

감사합니다. 그래도 상황이 제대로 작동하지 않습니다. "셰익스피어"의 저자와 함께 책을 가지고 있다고 가정 해 봅시다. 내 견해가 _that_ 책을 사용하고 있다면,'formset = AuthorFormset (queryset = book.authors.all())'이 잘 동작하는 것처럼 보입니다. 셰익스피어의 세부 사항을 담고있는 formset을 보여주는 formset을 보여줍니다. 그러나 내 견해가 새 모델을 사용하는 경우 formset은 비어 있어야합니다. 그러나'formset = AuthorFormset()'은 셰익스피어의 세부 사항이있는 양식을 보여 주기도합니다. 내가 예상했던 것처럼 빈 양식이 아닙니다. – trubliphone

관련 문제