【问题标题】:dynamic value of forms in one template一个模板中表单的动态值
【发布时间】:2014-03-14 21:33:56
【问题描述】:

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

我有两张桌子(Bill、Delivery) 一个账单最多可以有 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)

蓝色:表格 灰色:按钮

【问题讨论】:

  • 你可以给你的模型下雪并解释一下你尝试了什么吗?
  • 我现在写不出完整的答案,但我建议你看看Formsets。或者更好的是,如果你不想写所有东西,至少有 2 个项目可以满足你的需求:django-dynamic-formsetdjango-dinamyc-form
  • 您还可以阅读这些 SO 问题以获取更多信息:12

标签: django


【解决方案1】:

你的问题是双重的:

  1. 让 Django 在单个视图上使用表单和表单集
  2. 制作表单集 JavaScripty (tm)

嗯……

1) Form 和 Formset 一起放在一个 View 上

通常这将包括旧式(基于函数的)视图,因为基于类的视图不支持多个表单,也不支持 FormSet,更不用说一起了。例如,可以采用 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>

塔达啊!剩下要做的就是添加一些 CSS...

【讨论】:

  • 非常感谢。这对我来说很好。这是我的第一个 django 项目,如果没有你的帮助,我将无法做到这一点
【解决方案2】:

您可以使用 javascript 在模板中实现这一点

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

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 2022-11-03
    • 2015-11-23
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多