一个模板中表单的动态值

时间:2014-02-15 12:46:40

标签: django

我尝试制作一个django应用程序来创建账单。

我有两张桌子(比尔,送货) 一项法案最多可以交付5份。

现在我想要一张账单和一份送货单。要添加或删除交付,我想要一个按钮。

我正在使用基于类的视图。 如何在django中实现这一点?

我找到了django-extra-views,但我无法使用它。 我也看到了这个链接here,但这不是基于动态和动态的视图。

models.py

class Bill(models.Model):
    company = models.ForeignKey(Bioenergie)
    customer = models.ForeignKey(Customer)
    price = models.DecimalField(max_digits=5,decimal_places=2)
    bill_number = models.CharField(max_length=10, null=True)
    delivery_date = models.DateField()
    date = models.DateField(null=True)


class Delivery(models.Model):
    billing_choises = (('1', 'Menge'),
                       ('2', 'Gewicht/Feuchtigkeit')
    )
    option = models.CharField(choices=billing_choises, default=1, max_length=20)
    amount = models.PositiveIntegerField(blank=True, null=True)
    humidity = models.SmallIntegerField(blank=True, null=True)
    weight = models.DecimalField(blank=True, null=True, decimal_places=2, max_digits=5)
    bill = models.ForeignKey(Bill)

Image to show what my Website should contain 蓝色:表格 灰色:Buttoms

2 个答案:

答案 0 :(得分:4)

你的问题有两个:

  1. 使Django在单个视图上使用Form和Formset
  2. 制作Formset JavaScripty(tm)
  3. 嗯...

    1)在视图

    上将表格和表格集合在一起

    通常这包括旧式(基于函数的)视图,因为基于类的视图不支持多于一个Form,也不支持FormSets,更不用说一起了。一个人可以拿,比如说,UpdateView,然后“手动”让它处理一个FormSet,但这只是丑陋的,在这种情况下,最好采用旧式的观点,恕我直言。

    但是!感谢AWESOME django-extra-views,我们可以做这样的事情:

    <强> forms.py:

    from extra_views import InlineFormSet
    
    class DeliveryInlineFormSet(InlineFormSet):
        model = Delivery
        extra = 2  # we'll need to make it "0" for the JS later on
    

    <强> views.py:

    from extra_views import CreateWithInlinesView, UpdateWithInlinesView
    
    class CreateBillView(CreateWithInlinesView):
        model = Bill
        inlines = [DeliveryInlineFormSet, ]
        success_url = reverse_lazy('bills')
    
    
    class UpdateBillView(UpdateWithInlinesView):
        model = Bill
        inlines = [DeliveryInlineFormSet, ]
        success_url = reverse_lazy('bills')
    

    <强> bill_form.html:

    <form method="POST" action="">
        {{ form }}
    
        {% for formset in inlines %} 
            <hr />
            {# we're going to take advantage of the fact that we know there is only one inline #}
            <h3>Deliveries</h3>
            {{ formset.management_form }}
            {% for subform in formset %}
                <div class="subform">
                    {{ subform }}
                </div>
            {% endfor %}
            {# we'll add some JS here #}
        {% endfor %}
        <div>
            <hr />
            {% csrf_token %}
            <input type="submit" value="Save" name="save" />
        </div>
    </form>
    

    就是这样,一个工作的非JS Form + FormSet创建并更新View。

    2)创建FormSet JavaScripty(tm)

    有一些旧的项目,但它仍然有效:django-dynamic-formset

    要让它发挥作用:

    • 加载jQuery(可能不是2.x,但我还没有测试过它)
    • 加载jquery.formset.js
    • 在forms.py
    • 中设置extra = 0
    • 在上面的模板中找到{# we'll add some JS here #},并将其替换为:

    <script type="text/javascript">
        $(function(){
            $('.subform').formset({
               prefix: '{{ formset.prefix }}'
            });
        });
    </script>
    

    Tadaaa!剩下要做的就是添加一些CSS ...

答案 1 :(得分:0)

您可以使用javascript

在模板中实现此目的

希望这会有所帮助: http://sunnyarorablog.wordpress.com/2014/04/07/create-dynamic-forms-using-django-and-javascript/