Python 基于查询结果动态添加表单字段

Python 基于查询结果动态添加表单字段,python,django,forms,django-1.6,Python,Django,Forms,Django 1.6,我有一个模型问题,里面有一系列问题。对于查询此表的结果,我想创建一个CharField。这是我最初的尝试,没有导致任何错误,但没有显示任何内容: def __init__(self, **kwargs): super(QuestionnaireForm, self).__init__(**kwargs) self.fields['questionnaire'] = dict() questions = Question.objects.all() for ques

我有一个模型
问题
,里面有一系列问题。对于查询此表的结果,我想创建一个CharField。这是我最初的尝试,没有导致任何错误,但没有显示任何内容:

def __init__(self, **kwargs):
    super(QuestionnaireForm, self).__init__(**kwargs)
    self.fields['questionnaire'] = dict()
    questions = Question.objects.all()
    for question in questions:
        self.fields['questionnaire']['question' + str(question.pk)] = forms.CharField(widget=forms.TextInput(attrs=dict(placeholder=_("Answer"))), label=_(question))
在我的模板中,我尝试:

<div class="questionnaire">
    <h2>{% trans "Questionnaire" %}</h2>
    {% if form.questionnaire %}
        {% for question in form.questionnaire %}
            <div class="row">
                {% include "core/includes/field.html" with field=question %}
            </div>
        {% endfor %}
    {% endif  %}
</div>
在你看来试试这个

def myview(request):
    questions = Question.objects.all()
    if request.method == 'POST':

        form = MyForm(request.POST, extra=questions)
        if form.is_valid():
            pass
    else:
        form = MyForm(extra=questions)
        return render(request, "template", { 'form': form}) 
在forms.py中

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        extra = kwargs.pop('extra')
        super(LoginForm, self).__init__(*args, **kwargs)
        for question in extra:
            self.fields['question_%s' % extra.id] =  forms.CharField(widget=forms.TextInput())
用我们在参数中传递的额外字段来初始化表单

表单集:对于您的案例,您可以定义另一个表单问题:

class QuestionForm(forms.Form):
    question = forms.CharField()
视图:

您可以看到,我们使用多个表单(myform simple form和questions是表单集,用于动态添加问题字段),您可以在视图中选中此选项

def myview(request):
    questions = Question.objects.all()
    if request.method == 'POST':

        form = MyForm(request.POST, extra=questions)
        if form.is_valid():
            pass
    else:
        form = MyForm(extra=questions)
        return render(request, "template", { 'form': form}) 
在forms.py中

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        extra = kwargs.pop('extra')
        super(LoginForm, self).__init__(*args, **kwargs)
        for question in extra:
            self.fields['question_%s' % extra.id] =  forms.CharField(widget=forms.TextInput())
用我们在参数中传递的额外字段来初始化表单

表单集:对于您的案例,您可以定义另一个表单问题:

class QuestionForm(forms.Form):
    question = forms.CharField()
视图:

您可以看到,我们使用多个表单(myform simple form和questions是表单集,用于动态添加问题字段),您可以在视图中选中此选项

def myview(request):
    questions = Question.objects.all()
    if request.method == 'POST':

        form = MyForm(request.POST, extra=questions)
        if form.is_valid():
            pass
    else:
        form = MyForm(extra=questions)
        return render(request, "template", { 'form': form}) 
在forms.py中

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        extra = kwargs.pop('extra')
        super(LoginForm, self).__init__(*args, **kwargs)
        for question in extra:
            self.fields['question_%s' % extra.id] =  forms.CharField(widget=forms.TextInput())
用我们在参数中传递的额外字段来初始化表单

表单集:对于您的案例,您可以定义另一个表单问题:

class QuestionForm(forms.Form):
    question = forms.CharField()
视图:

您可以看到,我们使用多个表单(myform simple form和questions是表单集,用于动态添加问题字段),您可以在视图中选中此选项

def myview(request):
    questions = Question.objects.all()
    if request.method == 'POST':

        form = MyForm(request.POST, extra=questions)
        if form.is_valid():
            pass
    else:
        form = MyForm(extra=questions)
        return render(request, "template", { 'form': form}) 
在forms.py中

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        extra = kwargs.pop('extra')
        super(LoginForm, self).__init__(*args, **kwargs)
        for question in extra:
            self.fields['question_%s' % extra.id] =  forms.CharField(widget=forms.TextInput())
用我们在参数中传递的额外字段来初始化表单

表单集:对于您的案例,您可以定义另一个表单问题:

class QuestionForm(forms.Form):
    question = forms.CharField()
视图:



您可以看到我们使用多个表单(myform simple form和questions是表单集,用于动态添加问题字段)。您可以检查

是否可以向我们显示您的显示?@m170897017抱歉,不确定您的意思,我添加了渲染输出和一些调试输出,以防您所指的内容。谢谢:)你能给我们看一下你的显示器吗?@m170897017对不起,我不知道你的意思,我已经添加了渲染输出和一些调试输出,以防你指的就是这个。谢谢:)你能给我们看一下你的显示器吗?@m170897017对不起,我不知道你的意思,我已经添加了渲染输出和一些调试输出,以防你指的就是这个。谢谢:)你能给我们看一下你的显示器吗?@m170897017对不起,我不知道你的意思,我已经添加了渲染输出和一些调试输出,以防你指的就是这个。谢谢:)谢谢,你的答案看起来和我刚找到的很像。问题是我在模板的不同区域专门输出了其他字段。是否有一种方法可以专门选择符合字段名的字段并在模板中循环?谢谢,使用了您的方法,然后在模板中
{%for form%}{%if“id_question”{%if“id_question”in field.auto_id%}…{%endif%}{%endfor%}
帮助我只选择了所需的字段。很高兴它成功了,我在论坛中找到了另一个解决方案。你可以尝试formset。如果你愿意,它更灵活。我对formset太无知了!表单集是django中的一个很好的特性,它可以在FeatureTanks中帮助您,您的答案看起来和我刚才发现的很相似。问题是我在模板的不同区域专门输出了其他字段。是否有一种方法可以专门选择符合字段名的字段并在模板中循环?谢谢,使用了您的方法,然后在模板中
{%for form%}{%if“id_question”{%if“id_question”in field.auto_id%}…{%endif%}{%endfor%}
帮助我只选择了所需的字段。很高兴它成功了,我在论坛中找到了另一个解决方案。你可以尝试formset。如果你愿意,它更灵活。我对formset太无知了!表单集是django中的一个很好的特性,它可以在FeatureTanks中帮助您,您的答案看起来和我刚才发现的很相似。问题是我在模板的不同区域专门输出了其他字段。是否有一种方法可以专门选择符合字段名的字段并在模板中循环?谢谢,使用了您的方法,然后在模板中
{%for form%}{%if“id_question”{%if“id_question”in field.auto_id%}…{%endif%}{%endfor%}
帮助我只选择了所需的字段。很高兴它成功了,我在论坛中找到了另一个解决方案。你可以尝试formset。如果你愿意,它更灵活。我对formset太无知了!表单集是django中的一个很好的特性,它可以在FeatureTanks中帮助您,您的答案看起来和我刚才发现的很相似。问题是我在模板的不同区域专门输出了其他字段。是否有一种方法可以专门选择符合字段名的字段并在模板中循环?谢谢,使用了您的方法,然后在模板中
{%for form%}{%if“id_question”{%if“id_question”in field.auto_id%}…{%endif%}{%endfor%}
帮助我只选择了所需的字段。很高兴它成功了,我在论坛中找到了另一个解决方案。你可以尝试formset。如果你愿意,它更灵活。我对formset太无知了!表单集是django中的一个很好的特性,它可以在特性方面对您有很大的帮助