【问题标题】:Django ModelFormSet exclude (or filter) existing itemsDjango ModelFormSet 排除(或过滤)现有项目
【发布时间】:2015-08-30 02:00:29
【问题描述】:

我不确定我是否理解 modelformset_factory 库的工作原理。我想向用户呈现动态数量的表单以向数据库添加新项目。

我的模型是这样的:

#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 参数的问题的答案。如何过滤仅与该问题相关的答案项目?

另外,我可以排除已经存在的项目,只让用户添加新问题吗?

感谢您的帮助!

【问题讨论】:

  • 问题不在于工厂,而在于您如何实例化表单集,您没有显示。
  • @DanielRoseman 我不确定应该放哪一行。我添加了formset = AnswerModelFormSet() 行并将这个表单集传递给模板。

标签: django django-forms modelform formset


【解决方案1】:

您可以添加查询集参数来过滤要显示的答案:

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)

【讨论】:

    猜你喜欢
    • 2012-06-14
    • 2011-01-26
    • 2017-07-26
    • 2014-06-06
    • 1970-01-01
    • 2016-07-23
    • 2011-11-13
    • 2018-11-22
    • 2015-03-18
    相关资源
    最近更新 更多