0

私は本当にこれで立ち往生しています。私の問題を示すために、私は新しいDjangoプロジェクトを作成し、1つのフォームのみに焦点を当ててゼロから始めました。

私がやろうとしているのは、同じ名前の複数のフィールドを持つフォームを作成することです。私はmodelformset_factoryこれを達成するために使用しようとしましたが、それは私が本当に必要としているものではないように見えます。

以下は私のコードです(これもdpasteにあります)。これは現在、と呼ばれる1つのフィールドで正常に機能しますnamename複数のフィールドを持つフォームを作成して処理するにはどうすればよいですか?誰かが私を正しい方向に向けることができますか?

# 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',)

# views.py
def home(request):
    if request.method == 'POST':
        catform = CategoryForm(request.POST)
        catformInstance = catform.save(commit = False)
        catformInstance.save()
        return HttpResponseRedirect('')
    else:
        catform = CategoryForm() 

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

# home.html template
<h3>Insert new Category</h3> 
<form action="/" method="post" id="ingr-cat-form">{% csrf_token %}
{{ catform.as_p }}
<input type="submit" name="ingrCatForm" value="Save" />
</form>

更新:明確にするために、ユーザーが1つのフォーム内に複数のカテゴリを挿入できるようにします。私は近づいていると思います。これが私の新しいバージョンのviews.pyですが、それでも1つのカテゴリ(リストの最後のカテゴリ)のみが格納されます。

def home(request):
    if request.method == 'POST':
        catform = CategoryForm(request.POST)
        names = request.POST.getlist('name')
        catformInstance = catform.save(commit = False)
        for name in names:
            catformInstance.name = name
            catformInstance.save()
        return HttpResponseRedirect('')
    else:
        catform = CategoryForm() 

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

2 に答える 2

1

(同じモデル上に)同じ名前のフィールドを持つことはできません。htmlフォームのhtmlラベルのみを変更する必要がある場合は、

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

また

class CategoryForm(ModelForm):
    def __init__(self , *args, **kwargs):
        super(CategoryForm, self).__init__(*args, **kwargs)
        self.fields['name2'].label = "name"
于 2012-11-25T10:16:53.897 に答える
0

これが実用的なソリューションです。正しい方向に向けてくれた@YardenSTに感謝します。このチュートリアルに従うことで、最初の問題を解決することができました。

# 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',)

# views.py
def home(request):
if request.method == 'POST':
    catforms = [CategoryForm(request.POST, prefix=str(x), instance=Category()) for x in range(0,3)]
    if all([cf.is_valid() for cf in catforms]):
        for cf in catforms:
            catformInstance = cf.save(commit = False)
            catformInstance.save()
    return HttpResponseRedirect('')
else:
    catform = [CategoryForm(prefix=str(x), instance=Category()) for x in range(0,3)]

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


# home.html template
<h3>Insert new Category</h3>
<form action="/" method="post" id="ingr-cat-form">{% csrf_token %}
{% for catform_instance in catform %} {{ catform_instance.as_p }} {% endfor %}
<input type="submit" name="ingrCatForm" value="Save" />
</form>
于 2012-11-25T15:15:50.797 に答える