2015-06-14 19 views
0

我不確定我瞭解modelformset_factory庫的工作原理。我想向用戶展示一個動態數量的表單以向數據庫添加新項目。Django ModelFormSet排除(或過濾)現有項目

我的模式是這樣的:

#models.py 
class Question(models.Model): 
    user = models.ForeignKey(User) 
    text = models.CharField(max_length=100) 

class Answer(models.Model): 
    question = models.ForeignKey(Question) 
    text = models.CharField(max_length=100) 

,因此用戶可以定義的問題,並儘可能多的回答(選擇)這個問題。

所以在我看來,我希望得到他們想要多少答案添加和創建動態表單集,這樣的:

def q_answers(request, qid, howManyAnswersMore): 
    AnswerModelFormSet = modelformset_factory(Answer, fields=('question','text'), extra = howManyMore) 
    formset = AnswerModelFormSet() 

的問題是,我的表單集包含數據庫中所有的答案(所以問題#1的回答#1,q1的a2,q2的a1,q2的a2等)

但是,我只想顯示URL中用qid參數表示的問題的答案。如何過濾僅與該問題相關的答案項目?

此外,我可以排除已經存在的項目,只讓用戶添加新的問題嗎?

感謝您的幫助!

+0

的問題是不是與工廠,但是你如何實例化你不顯示的formset。 –

+0

@DanielRoseman我不知道我把哪一條線放在。我添加了'formset = AnswerModelFormSet()'這一行,並將這個formset傳遞給模板。 – jeff

回答

0

要麼你可以添加查詢集參數過濾要回答顯示:

def q_answers(request, qid, howManyAnswersMore): 
    AnswerModelFormSet = modelformset_factory(Answer, fields=('question','text'), extra = howManyMore) 
    formset = AnswerModelFormSet(queryset=Transaction.objects.filter(quistion=qid)) 

或者你可以擴展BaseModelFormSet類並覆蓋其queryset屬性:

class BaseAnswerFormSet(BaseModelFormSet): 
    def __init__(self, *args, **kwargs): 
     super(BaseAnswerFormSet, self).__init__(*args, **kwargs) 

     #create filtering here whatever that suits you needs 
     self.queryset = Answer.objects.filter(question=qid) 
def q_answers(request, qid, howManyAnswersMore): 
    formset = modelformset_factory(Answer, formset=BaseTransactionFormSet,form=AnswerDateForm, extra=0, can_delete=False)