[Answer]-How to create and process a form with multiple same fields?

1๐Ÿ‘

โœ…

You cannot have fields with the same name (on the same Model). If you only need to change the html label in the html form, use

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)

or

class CategoryForm(ModelForm):
    def __init__(self , *args, **kwargs):
        super(CategoryForm, self).__init__(*args, **kwargs)
        self.fields['name2'].label = "name"
๐Ÿ‘คYardenST

0๐Ÿ‘

Here is a working solution. Thanks to @YardenST for pointing me in the right direction. I managed to solve my initial problem by following this tutorial.

# 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>
๐Ÿ‘คfinspin

Leave a comment