2015-06-14 43 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)