【问题标题】:Django dynamic Form using json data使用 json 数据的 Django 动态表单
【发布时间】:2016-04-25 21:41:38
【问题描述】:

我看过很多动态表单的例子,但似乎找不到我的答案,所以请帮助我解决以下要求:

我有一个包含如下数据的 json 文件:

    {
    "cat1": {
        "product1": {
            "item1": "check box p1i1",
            "item2": "check box p1i2",
            "item3": "check box p1i3"
        },
        "product2": {
            "item1": "check box p2i1",
            "item2": "check box p2i2",
            "item3": "check box p2i3"
        }
    },
    "cat2": {
        "product1": {
            "item1": "check box p1i1",
            "item2": "check box p1i2",
            "item3": "check box p1i3"
        },
        "product2": {
            "item1": "check box p2i1",
            "item2": "check box p2i2",
            "item3": "check box p2i3"
        }
    }
}

我已经根据类别然后项目呈现数据,因此用户将首先选择类别然后选择他想要的项目,并在此基础上根据选择过滤json文件,然后将其呈现为相关模板:

问题是由于创建的表单不是 Django 表单,所以我如何才能在视图中获取发布的数据,(会有一个输入框和几个复选框(基于用户选择)

views.py

def select_cat1(request, item):
    if request.method=='POST':
        ?(how to get posted data here?)

    else:
     data = open(json_file).read()
        json_data = json.loads(data)
        product_list = {}
        for key in json_data.get('cat1'):
            product_list[key] = json_data['cat1'][key][item]
        return render(request, 'cat1.html', {'item': item, 'product_list': product_list })

def select_cat2(request, item):
  if request.method=='POST':
        ?(how to get posted data here?)

    else:
     data = open(json_file).read()
        json_data = json.loads(data)
        product_list = {}
        for key in json_data.get('cat2'):
            product_list[key] = json_data['cat2'][key][item]
        return render(request, 'cat2.html', {'item': item, 'product_list': product_list })

cat1.html

{% extends 'base.html' %}


{% block content %}

<form method="POST">{% csrf_token %}
    <label>enter your phone:</label>  
    <input type="text" id="mobile_number">

    {% for key, value in product_list.items %}
        <input type="checkbox" name="{{ key }}" value="{{ key }}"> {{ value }}<br>
    {% endfor %}

  <button type="submit" >Submit</button>
</form>

{% endblock %}

【问题讨论】:

    标签: python json django


    【解决方案1】:

    您提交的多个产品具有相同的商品。因此,输入具有相同的名称(item1、item2、item3),您无法分离产品。您必须在输入的名称属性中包含产品 ID 和商品 ID。

    另一个“问题”是您已将视图分开以处理类别。如果您将类别作为参数传递并从视图提交回来,则不需要多个视图。

    views.py

    def select_cat(request, item, category):
        data = open(json_file).read()
        json_data = json.loads(data)
        product_list = json_data.get(category)
    
        if request.method == 'POST':
            # loop through json product_list and check try to get items from request.POST
            for (product_key, product) in product_list.items():
    
                # loop through submited values from request.POST
                for (item_key, item) product.items():
                   submited_item =  request.POST['%s-%s' % (product_key, item_key)]
    
    
    
        else:
            return render(request, 'category.html', {
               'item': item, 
               'product_list': product_list,
               'category': category
            })
    

    category.html

    {% extends 'base.html' %}
    
    {% block content %}
    
        <form method="POST" action="url with category here">{% csrf_token %}
            <label>enter your phone:</label>
            <input type="text" id="mobile_number" />
    
            {% for product_key, product in product_list %}
                {% for item_key, item in product %}
                    <input type="checkbox" name="{{ product_key }}-{{ item_key }}" value="{{ product_key }}-{{ item_key }}" />{{ item_value }}<br />
                {% endfor %}
            {% endfor %}
    
            <button type="submit" >Submit</button>
        </form>
    
    {% endblock %}
    

    【讨论】:

    • 感谢您的回答和建议,但这仍然不是我的回答,问题是我已经解析了json文件并以模板形式呈现,所以这个表单不是django表单,并且一旦用户点击提交,那么我需要输入框(值)和用户通过复选框检查它们的项目,所以:如果 request.method == 'POST': (这里我需要已检查的项目为复选框,我还需要输入框值)
    • 如果 request.method == 'POST' 使用 request.POST['%s-%s' % (product_key, item_key)],你将在里面得到提交的项目
    猜你喜欢
    • 2019-03-27
    • 2017-07-21
    • 2017-07-23
    • 2013-02-03
    • 1970-01-01
    • 2018-05-24
    • 2021-10-15
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多