【问题标题】:django model formset factory how to write {{ form.field }}django model formset factory如何写{{ form.field }}
【发布时间】:2021-06-25 11:02:26
【问题描述】:

所以对于表单,如果您在 forms.py 中有数量 = IntegerField(),那么您可以在 html 文件中编写 {{ form.quantity }} 来获取数量的输入。你怎么能对modelformset_factory做同样的事情?

I've created a formset to ask the user for the item name and quantity. The item name is given by the loop. I need to move the modelformset factory inside the loop for each iteration, but I don't know how

#views.py
    #for showing items
    if (Items.objects.filter(item_category="Produce").exists()):
        produce = Items.objects.filter(item_category="Produce", show=True, quantity__gte=1)
    if (Items.objects.filter(item_category="Grains").exists()):
        grains = Items.objects.filter(item_category="Grains", show=True, quantity__gte=1)
    if (Items.objects.filter(item_category="Protein/Dairy").exists()):
        protein_dairy = Items.objects.filter(item_category="Protein/Dairy", show=True, quantity__gte=1)
    if (Items.objects.filter(item_category="extras").exists()):
        extras = Items.objects.filter(item_category="extra items", show=True, quantity__gte=1)

    
    #playing with formset
    form_extras = Items.objects.filter(show=True).count()
    formset = modelformset_factory(Cart, form=CustomerOrderForm,extra=form_extras)
    form = formset(queryset=Items.objects.none())
    if request.method == 'POST':
        form = formset(request.POST)
        #work on this
        if form.is_valid():
            print("is valid")
            form = formset(request.POST)
            instances = form.save(commit=False)
            for instance in instances:
                #item previously in cart
                if (Cart.objects.filter(username=request.user, item_name=form.cleaned_data.get('item_name')).exists()):
                    cart_instance = Cart.objects.get(username=request.user, item_name=form.cleaned_data.get('item_name'))
                    cart_instance.quantity = cart_instance.quantity + form.cleaned_data.get('quantity')
                    cart_instance.save()
                else:
                    #item never in cart, create new instance
                    item_instance = Items.objects.get(item_name=form.cleaned_data.get('item_name'))

                    Cart.objects.create(username=request.user, item_name=form.cleaned_data.get('item_name'), weight=item_instance.weight, quantity=form.cleaned_data.get('quantity'), description=item_instance.description, image=item_instance.image, price=item_instance.price, storage_type=item_instance.storage_type, item_category=item_instance.item_category, limit=item_instance.limit,)
        
            timestamp = datetime.date.today()
            messages.success(request,"Sucessfully added your items to your cart! " + str(timestamp))
            return redirect('/')
        else:
            print("form not valid for cart")
            form = formset()

    user_produce_points = request.user.profile.produce_points
    user_grain_points = request.user.profile.grain_points
    user_protein_dairy_points = request.user.profile.protein_dairy_points
    user_extras_points = request.user.profile.extra_items_points

主页.html:

#home.html
<form method="POST">
        {% csrf_token %}
        {{ form.management_form }}
        {{form.as_p}} 
        <div class="row">    

          {% for item in produce %}
            <div class="card" style="width: 18rem;">

                <img src="/media/{{ item.image }}" class="card-img-top" alt="...">

                <div class="card-body">
                    <h5 class="card-title text-center">
                        <b>{% if item.storage_type == "Frozen" %}
                              Frozen 
                            {% endif %}
                        {{ item.item_name }} ({{ item.weight }} oz)</b></h5>

                    <h6 class ="card-title text-center" style="color:green;font-size: 16px;"><b>{{ item.price }} Produce 
                      {% if item.price < 2 %}
                      Point
                      {% else %}
                      Points
                      {% endif %}

                    </b></h6>
                    
                    <p class="card-text">{{ item.description }}</p>
                    <br><br>

                
                      <div class="input-quantity">
                      
                        <input type="hidden" name="form-{{forloop.counter}}-item_name" value="{{ item.item_name }}">
                        {{form.quantity}}
                        {{form.item_name}}
                        {{form.field}}

                        Quantity: <input style="max-width:3em;" type="number" name="form-{{forloop.counter}}-quantity" pattern="[0-9]{3}" min="0" max="{{ item.limit }}">
            
                      </div>

                    
                </div>
            </div>
            {% endfor %}
            <br>

            <button type="submit" style="height:38px;" class="btn btn-primary btn-lg sharp" type="button">Add to Cart</button>
              </form>

【问题讨论】:

    标签: django django-forms formset


    【解决方案1】:

    Django Docs 总是有一个很好的例子,它总是对我有帮助。

    遗憾的是,您没有发布(我假设您没有发布)视图函数的其余部分,所以我只能猜测模板中的 form 指的是在视图中创建的表单集,并且被传递.如果是这样,您需要先创建 for 循环,然后才能在 name="form-{{forloop.counter}}-item_name" 中访问它。你可以这样创建它:

    {% for form_line in form %}
        <!--form_line rendering you have-->
        <p>Form #{{ forloop.counter }}</p>
        {{ form_line.quantity }}
        {{ form_line.item_name }}
        {{ form_line.field }}
    {% endfor %}
    

    在您的模板中,您还拥有produce 变量。我不确定那指的是什么,也许是因为我看不到整个视图功能。

    【讨论】:

    • 我编辑了第一篇文章以显示整个views.py。还有一个可点击的屏幕截图,以前在那里。我想为管理员想要出售的所有商品设置一个提交按钮。这些项目分为 4 个类别:农产品、谷物、蛋白质/乳制品和附加产品。每个类别的循环都是相同的,所以我没有为每个类别发布它。问题是循环来自“Items”模型(基本上是管理员使用的库存),而用户只能将东西插入“Cart”模型。所以很遗憾,我无法使用您显示的循环。
    • "name="form-{{forloop.counter}}-item_name"" 部分是因为当我检查默认 django {{ formset }} 时,我注意到它说“form- 0-item_name”,其中 item_name 是我的变量,下一次迭代只是“form-1-item_name”,所以我想尝试看看它是否会工作......它没有。如果有一种方法可以使用像 {{ form.fields }} 或 {{ form.item_name }} 和 {{ form.quantity }} 这样的简单标签来声明整个表单“块”,那么这将是一个救命稻草。我必须真正考虑如何才能适应 for 循环的形式。我认为这并不容易......
    猜你喜欢
    • 2011-05-29
    • 2020-03-17
    • 2019-03-06
    • 2016-09-12
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    相关资源
    最近更新 更多