显示来自一个模型的数据并使用表单更新由外键关联的另一个模板

时间:2014-04-30 18:04:20

标签: python django django-forms

我认为这必须是一个基本的Django问题,但我似乎无法找到任何文件让我在几个小时的搜索后更接近解决方案。

我有两个模型 - 一个可以有一个或多个答案的问题。 Answer模型使用外键关系引用Question模型。

我希望该页面提供随机问题,然后允许用户输入该问题的答案。我想我最困惑的是如何使用表单或表单来完成此操作。

这是我的代码,删除了无关的元素:

models.py

class Question(models.Model):
    text = models.TextField(unique=True)

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

forms.py

class QuestionForm(forms.ModelForm):
    text = forms.CharField(widget=forms.Textarea(attrs={'class':'form-control', 'rows':2, 'placeholder':'Enter your question here'}))

    class Meta:
        model = Question

AnswerFormset = inlineformset_factory(Question, Answer)

views.py

def index(request):
    context = RequestContext(request)
    error = False
    question = Question.objects.order_by('?')[0]    

    if request.POST:
        form = AnswerFormset(request.POST, instance=question)
        if form.is_valid():
            form.save(commit=True)
            return HttpResponse("Success")
        else:
            error = True
            return HttpResponse("Error")
    else:
        form = AnswerFormset(instance=question)
    return render_to_response('index.html', {"question": question, "form": form}, context)

模板(index.html)

<form role="form" id="answer_form" method="post" action="">
<p id="question">{{ question.text }}</p>
    {% csrf_token %}
    {{ form }}
    <button type="submit" class="btn btn-warning btn-lg">Answer</button>
</form>

目前的情况是,页面加载并显示问题和一堆输入字段,其中包含与该问题关联的现有Answers以及3个额外的空白输入字段。 我想只显示一个空白输入字段,其中可以输入答案。我猜这意味着要操纵哪个窗口小部件上使用的窗口小部件,但我不确定如何。

提交操作无法正常工作,我可能会离开某处。我得到一个“列表索引超出范围”错误,我怀疑它与我如何保存AnswerFormset POST数据有关。

1 个答案:

答案 0 :(得分:1)

检查inlineformset_factory表示您可以传递关键字参数extra=1,以使其根据需要生成一个(而不是3个)内联表单:

def inlineformset_factory(parent_model, model, form=ModelForm,
                      formset=BaseInlineFormSet, fk_name=None,
                      fields=None, exclude=None,
                      extra=3, can_order=False, can_delete=True, max_num=None,
                      formfield_callback=None):

因此:

AnswerFormset = inlineformset_factory(Question, Answer, extra=1)

编辑:的确,extra关键字文档确认了这一点:https://docs.djangoproject.com/en/dev/topics/forms/formsets/#formsets