2012-11-25 41 views
0

我真的被這個困住了。爲了顯示我的問題,我創建了一個新的Django項目,並從頭開始,只關注單一表單。如何創建和處理具有多個相同字段的表單?

我想要做的是創建一個窗體與幾個相同的名稱的字段。我嘗試使用modelformset_factory來實現這一點,但它在我看來並不是我真正需要的。

以下是我的代碼(也在dpaste),它目前正在使用一個名爲name的單個字段正常工作。我如何創建和處理一個有幾個name字段的表單?有人能指出我正確的方向嗎?

# 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> 

UPDATE:澄清,我想允許用戶一個表單中插入多個類別。我覺得我越來越近,這裏是我的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)) 

回答

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" 
+0

我不想向模型中添加其他字段。我想讓用戶在一個表單中插入多個'name'值。 – finspin

+0

你想要一個表單添加許多類別? – YardenST

+0

是的,這就是我想要做的。 – finspin

0

這裏是一個可行的解決方案。感謝@YardenST指引我朝着正確的方向發展。我設法通過遵循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> 
相關問題