【问题标题】:Is it possible to display a form by passing a filter to a field in django是否可以通过将过滤器传递给 django 中的字段来显示表单
【发布时间】:2016-02-22 10:23:31
【问题描述】:

当我在模板中调用表单时,我希望我可以在课堂回复中实例化字段问题

class Page(models.Model):
    title = models.CharField(max_length=30)


    def __str__(self):
        return self.title

class Question(models.Model):
    label = models.CharField(max_length=30)
    page = models.ManyToManyField(Page)

    def __str__(self):
            return self.label

class Reply(models.Model):
    question = models.ForeignKey(Question)
    user = models.ForeignKey(Personne)
    answer = models.CharField(max_length=30)
    creationDate = models.DateTimeField(default=django.utils.timezone.now)

    def __str__(self):
        return str(self.answer)

是否可以根据我所在的页面过滤我的问题。也就是说,如果我称为一次访问的页面我有 2 个问题不能让我在这两个问题之间进行选择在他的 3 个问题之间......

我希望能够在调用回复表单时过滤问题的选择

class ReplyForm(forms.ModelForm):
    class Meta:
        model = Reply
        exclude = ('user','creationDate')

有必要在我的模型和视图中添加一些东西吗?

def access(request, instance):
    replies = Reply.objects.all()
    pages = Page.objects.all()
    numPages = Page.objects.get(pk=instance)
    questions = Question.objects.filter(page=instance)
    length_questions = len(questions)
    logged_user = get_logged_user_from_request(request)
    ReplyFormSet = modelformset_factory(model=Reply, form=ReplyForm, extra=length_questions, can_delete=True)
    formset = ReplyFormSet(request.POST)
    if request.method == 'POST':  
        formset = ReplyFormSet(request.POST)
        if formset.is_valid():
            new_instances = formset.save(commit=False)
            for new_instance in new_instances:
                new_instance.user = logged_user
                new_instance.save()
            return HttpResponseRedirect('/baseVisite/')
        else:
            messages.add_message(request, messages.INFO, 'Le formulaire est incorrecte !')
            return render_to_response('polls/error.html', context_instance=RequestContext(request))
    else:
        formset = ReplyFormSet(queryset=Reply.objects.none())
    return render_to_response('polls/access.html', {
     'formset': formset,
     'questions':questions,
     'logged_user':logged_user,
     'numPages' : numPages
     })

编辑:

我试图在我的表单中定义 init 方法,但我似乎无法让我的过滤器根据页面显示问题

class ReplyForm(forms.ModelForm):
    class Meta:
        model = Reply
        exclude = ('user','creationDate')
    def __init__(self, instance, *args,**kwargs):
        super (ReplyForm,self ).__init__(*args,**kwargs)
        instance = kwargs.get('instance')
        self.fields['question'].queryset = Question.objects.filter(page = instance)

【问题讨论】:

    标签: python django forms django-forms


    【解决方案1】:

    当您为获取请求实例化表单集时:
    formset = ReplyFormSet(queryset=Reply.objects.none())
    相反,您应该将要显示为查询集的问题传递给它。您可以传递任何查询集,例如
    formset = ReplyFormSet(instance=Reply.objects.filter(question='foo'))
    formset = ReplyFormSet(instance=Reply.objects.exclude(question='bar'))
    应该做自己喜欢的事。

    【讨论】:

    • 我找到了我需要更改的内容,但我不知道如何进行这项工作,就是这一行:self.fields['question'].queryset = Question.objects.filter(page = instance)
    • 它必须通过显示页面问题进行过滤,否则就是
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多