首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Django中呈现FormSet

在Django中呈现FormSet
EN

Stack Overflow用户
提问于 2019-06-26 15:13:53
回答 1查看 37关注 0票数 1

我希望创建一个允许用户根据需要添加表单的FormSet。但是,当我呈现页面时,我收到了一个错误:

代码语言:javascript
复制
ValueError: The view website.views.presales didn't return an HttpResponse object.
  It returned None instead.

我总是把表格呈现为空白。如果需要其他信息,请告诉我,谢谢!

注意:cwObj.get_opportunities()是一个API调用,用于从JSON响应创建一个对象,以填充select_opportunity下拉列表。最后,我使用AJAX使用data-total-url="{% url 'presales_total' %}"动态计算span Total的值。

forms.py

代码语言:javascript
复制
class PresalesForm(forms.Form):
    class Meta:
        model = Presales
        fields = ('selected_opportunity', 'task_description', 'hours', 'selected_engineer_level', 'total_cost')

views.py

代码语言:javascript
复制
def presales(request):
    my_opportunities = cwObj.get_opportunities()

    PresalesFormSet = formset_factory(PresalesForm, extra=1)

    if request.method == 'POST':
        presales_formset = PresalesFormSet(request.POST)

        if presales_formset.is_valid():

            for presales_form in presales_formset:
                selected_opportunity = request.POST.get('selected_opportunity')
                task_description = request.POST.get('task_description')
                hours = request.POST.get('hours')
                select_engineer_level = request.POST.get('select_engineer_level')

            else:
                presales_formset = PresalesFormSet(initial="None")

                context = {'presales_formset': presales_formset, 'my_opportunities': my_opportunities}

            return render(request, 'website/presales.html', context)

presales.html

代码语言:javascript
复制
<form action="{% url 'presales' %}" method="post" name="presalesForm" id="presalesForm" data-total-url="{% url 'presales_total' %}">
                {% csrf_token %}

                {{ presales_formset.management_form }}

                {% for presales_form in presales_formset %}
                <div class="field">
                    <label class="label is-large">Create Task</label>
                </div>
                <div class="section">
                    <div class="field">
                        <label class="label">Opportunity</label>
                        <div class="select">
                            <select name="select_opportunity" id="select_opportunity">
                                <option value="">Opportunity</option>
                                {% for opportunity in my_opportunities %}
                                <option name="selected_opportunity" id="selected_opportunity" value="{{ opportunity.name }}">{{ opportunity.name }}</option>
                                {% endfor %}
                            </select>
                        </div>
                    </div>
                    <label class="label">Task Description:</label>
                    <div class="field">
                        <div class="control">
                            <input class="input" name="task_description" id="task_description" placeholder="Task Description">
                        </div>
                    </div>
                    <label class="label">Hours</label>
                    <div class="field">
                        <div class="control">
                            <input class="input" name="hours" id="hours" placeholder="Hours">
                        </div>
                    </div>
                    <label class="label">Engineer Level:</label>
                    <div class="field">
                        <div class="select">
                            <select name="select_engineer_level" id="select_engineer_level">
                                <option value="">Engineer Level</option>
                                <option value="PM">PM</option>
                                <option value="Solutions Technician">Solutions Technician</option>
                                <option value="Solutions Engineer">Solutions Engineer</option>
                                <option value="Senior Solutions Engineer">Senior Solutions Engineer</option>
                                <option value="Solutions Architect">Solutions Architect</option>
                            </select>
                        </div>
                    </div>
                </div>
                <div class="field">
                    <div class="control">
                        <button class="button is-info" type="button">Add Task</button>
                    </div>
                </div>
                {% endfor %}
                <span class="label is-medium is-pulled-right" id="total_cost">Total: {{ total }}</span>
            </form>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-26 15:27:55

您的视图在所有情况下都没有而不是返回HttpResponse,这是一个错误。当request.method与POST不同时,以及当格式化集无效时,就会发生这种情况。

当移除大部分代码并只留下条件语句时,很容易发现这一点:

代码语言:javascript
复制
def presales(request):
    if request.method == 'POST':
        if presales_formset.is_valid():
            ...
            return render(request, 'website/presales.html', context)

在其他情况下,您还必须返回其他HttpResponse,以解决此错误。

例如,您可以取消缩进行return render(... 2级别,以便视图始终返回模板。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56776060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档