0

フォームフィールドをループしてデータベースに保存しようとしています。問題は、保存されるのは常に最後のフィールドだけであるということです。以前のものは「スキップ」されます。Djangoでフォームを次のように処理できますか?

models.py:

class Category(models.Model):
    name = models.CharField(max_length=30, unique=True)
    user = models.ForeignKey(User, blank=True, null=True)

    class Meta:
        verbose_name_plural = "Ingredience Categories"

    def __unicode__(self):
        return self.name

forms.py

class CategoryForm(ModelForm):
    class Meta:
        model = Category
        fields = ('name',)

home.htmlテンプレート(jQueryを介して入力フィールドを動的に追加できるようにしたいので、フォームを「手動で」ビルドします):

<h3>Insert New Categories</h3>
<form action="/" method="post" id="ingr-cat-form">{% csrf_token %}
    <p><label for="id_0-name">Name:</label> <input type="text" maxlength="30" name="name" id="id_0-name"></p>
    <p><label for="id_1-name">Name:</label> <input type="text" maxlength="30" name="name" id="id_1-name"></p>
    <p><label for="id_2-name">Name:</label> <input type="text" maxlength="30" name="name" id="id_2-name"></p>
    <input type="submit" name="ingrCatForm" value="Save" /> 
</form> 

views.py:

def home(request):
    if request.method == 'POST':
        catform = CategoryForm(request.POST, instance=Category()) # store bounded form to catform
        catformInstance = catform.save(commit = False)  # create instance for further modification, don't commit yet
        catformNames = request.POST.getlist('name') # get a list of input values whose element name is "name"
        for name in catformNames: # loop through all name elements
            catformInstance.name = name # modify form instance; insert current name
            catformInstance.save() # save the instance to the database
        return HttpResponseRedirect('')
    else:
        catform = CategoryForm(instance=Category())

    context = {'catform': catform}
    return render_to_response('home.html', context, context_instance=RequestContext(request))

テストケースの手順:

  1. 次の値を3つの入力フィールドに挿入します:value1、value2、value3
  2. 送信ボタンを押します

期待される結果:

  • 3つの値すべてがデータベースに保存されます

実結果:

  • 最後の値(value3)のみがデータベースに保存されます
4

1 に答える 1

8

のインスタンスを 1 つだけ作成catformInstanceし、ループ内で毎回その値を変更します。毎回新しい行を作成するのではなく、データベース内の 1 つの行を更新しています。

代わりにこれを行います:

    for name in request.POST.getlist('name'):
        catform = CategoryForm({'name': name}, instance=Category())
        catform.save()

nameのセット全体ではなく、それぞれを明示的に渡すことに注意してください。POSTその場合、リストから姓を取得するだけnameで、次の反復nameでリクエストから利用できなくなるため失敗します。

于 2012-11-26T11:04:56.633 に答える