简体   繁体   English

在Django中的表单中多次出现同一行

[英]same row multiple times in a form in django

have a form by which user can enter details about some expenses but i want to have same row in the form again and again but couldn't find out how to do that : 有一个表格,用户可以通过该表格输入有关一些费用的详细信息,但是我想一次又一次地在表格中有相同的行,但找不到如何做到这一点:

在此处输入图片说明

if you see figure above this forms works well for 1 row of data , saves well but with more then 1 row it cant . 如果您看到上面的图,此表格适用于1行数据,可以很好地保存,但超过1行则不能。 Can someone suggest any way to do that . 有人可以建议任何方式做到这一点。 Below are the codes : 以下是代码:

models.py models.py

from django.db import models


class Expenditure(models.Model):
    exp_date = models.DateField("Expenditure_Date")
    description = models.CharField(max_length=500)
    amount = models.FloatField(default=0)
    currency = models.CharField(max_length=15,default="USD")

    class Meta:
        unique_together = ('exp_date', 'description',)

    def __unicode__(self):
        return self.description

forms.py forms.py

from django import forms
from moni.models import Expenditure
from django.contrib.admin.widgets import AdminDateWidget


class ExpenditureForm(forms.ModelForm):
    #exp_date = forms.DateField(help_text="Date")
    exp_date = forms.DateField(widget=AdminDateWidget)
    description = forms.CharField(max_length=500)
    amount = forms.FloatField(initial=0)
    currency = forms.CharField(widget=forms.HiddenInput(), initial="USD")

    # An inline class to provide additional information on the form.
    class Meta:
        # Provide an association between the ModelForm and a model
        model = Expenditure
        fields = ('exp_date', 'amount', 'description')

views.py views.py

from django.template import RequestContext
from django.shortcuts import render_to_response
from moni.models import Expenditure
from moni.forms import ExpenditureForm

def add_expenditure(request):
    context = RequestContext(request)

    if request.method == 'POST':
        form = ExpenditureForm(request.POST)

        if form.is_valid():

            form.save(commit=True)
            return index(request)
        else:

            print form.errors
    else:

        form = ExpenditureForm()


    return render_to_response('moni/add_expenditure.html', {'form': form}, context)

add_expenditure.html add_expenditure.html

{% extends 'moni/base.html' %}

{% block title %}Add Shipment {% endblock %}

{% block body_block %}
        <h1>Add a Expenditure</h1>
        <p id="p_hide"> I am a paragraph to be hidden</p>
        <button id ="btn1">Hide Paragraph</button>

        <form id="expenditure_form" method="post" class="vDateField" action="/moni/add_expenditure/">

            {% csrf_token %}

            <table border=1>
                <tr><th><label >Date:</label></th> <th><label for="id_description">Description:</label></th><th><label for="id_amount">Amount:</label></th></tr>
            <tr><td><input class="vDateField"  name="exp_date" size="10" type="text" /></td><td>{{form.description}}</td><td>{{form.amount}}<input id="id_currency" name="currency" type="hidden" value="MYR" /></td></tr>
            <tr><td><input class="vDateField"  name="exp_date" size="10" type="text" /></td><td>{{form.description}}</td><td>{{form.amount}}<input id="id_currency" name="currency" type="hidden" value="MYR" /></td></tr>
        </table>
        <input type="submit" name="submit" value="Create Expenditure" />
    </form>
{% endblock %}

You should use ModelFormSets instead of ModelForm. 您应该使用ModelFormSets而不是ModelForm。 And if you're going to add forms dynamically, use corresponding JavaScript plugin (since management form should be changed every time new form is added). 而且,如果要动态添加表单,请使用相应的JavaScript插件(因为每次添加新表单时都应更改管理表单)。

For that use Formeset function, Here is the idea for print form in multiple times 为此,请使用Formeset函数,这是多次打印表格的想法

 ExpenditureFormSet = formset_factory(ExpenditureForm, extra=3,)

And views like 和类似的意见

if formset.is_valid():
            for data in formset.cleaned_data:

And pass it into {formset} So html will print the extra 3 forms 并将其传递到{formset}因此html将打印出另外3种形式

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM