2017-01-12 40 views
-1

我已經查看了所有類似的問題(並試過它們),但仍無法找到答案。Django只保存formset的第一種形式

我有兩個型號:

class Project(models.Model): 
    author = models.ForeignKey(settings.AUTH_USER_MODEL, default=1) 
    name = models.CharField(max_length=120, verbose_name = "Название проекта") 
    url = models.URLField(max_length=120, unique=True, verbose_name = "Полный адрес сайта") 
    robots_length = models.CharField(max_length=5, default=0) 
    updated = models.DateTimeField(auto_now=True, auto_now_add=False) 
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True) 

    def __unicode__(self): 
     return self.name 

    def __str__(self): 
     return self.name 

    def get_absolute_url(self): 
     from django.urls import reverse 
     return reverse('projects:detail', args=[str(self.id)]) 

class ProjectPage(models.Model): 
    page_project = models.ForeignKey(Project, on_delete=models.CASCADE) 
    page_url = models.URLField(verbose_name = "Адрес страницы") 
    page_title = models.CharField(max_length=300, blank=True, verbose_name = "meta-title",default="") 
    page_description = models.CharField(max_length=300, blank=True, verbose_name = "meta-description",default="") 
    page_h1 = models.CharField(max_length=300, blank=True, verbose_name = "Заголовок h1",default="") 

    def __unicode__(self): 
     return self.page_url 

    def __str__(self): 
     return self.page_url 

對於每個模型有一個表單:

class ProjectFormUpdate(forms.ModelForm): 
    class Meta: 
     model = Project 
     fields = [ 
      "name", 
      "url", 
     ] 
     widgets = { 
      'name': forms.TextInput(attrs={'placeholder': 'Произвольное название'}), 
     } 

class ProjectPageForm(forms.ModelForm): 
    class Meta: 
     model = ProjectPage 
     fields = [ 
      'page_project', 
      'page_url', 
      'page_title', 
      'page_description', 
      'page_h1', 
     ] 
     widgets = { 
      'page_project': forms.HiddenInput() 
     } 

在views.py我有:

def projects_update(request, proj=None): 
    instance = get_object_or_404(Project, id=proj) 
    form = ProjectFormUpdate(request.POST or None, instance=instance) 

    formset_f = modelformset_factory(ProjectPage, form=ProjectPageForm, extra=3) 
    formset = formset_f(queryset=ProjectPage.objects.filter(page_project__id=proj), initial =[{'page_project': proj}]) 

    if request.method == 'POST': 
     formset = formset_f(request.POST) 
     for formset_form in formset: 
      if formset_form.is_valid() and formset_form.has_changed(): 
       formset_form.save() 
     if form.is_valid(): 
      form.save() 

    context = { 
     'title': "Редактируем проект - "+instance.name, 
     'form': form, 
     'formset': formset, 
     'instance': instance, 
     } 
    return render(request, "projects_update.html", context) 

而且,finaly,HTML

<form method="POST" action="" class="create-form"> 
{{ formset.management_form }} 
{% csrf_token %} 
<div class="row"> 
    <div class="col-lg-6 offset-lg-3 col-md-10 offset-md-1 col-xs-10 offset-xs-1 form-bg"> 

     <h2>Общие данные</h2> 

     {{ form|crispy}} 
    <input type="submit" class="btn btn-success" value="Обновить проект" /> 


    </div> 
</div> 

{% for formset_form in formset %} 
<div class="row form-container"> 
    <div class="col-lg-6 offset-lg-3 col-md-10 offset-md-1 col-xs-10 offset-xs-1 form-bg"> 
     <h3>Страница {{forloop.counter}}</h3> 


     {{ formset_form|crispy}} 


    </div> 
</div> 
{% endfor %} 

</form> 

我想要實現的是:當用戶輸入一個頁面時,他會得到一個表單,其中已經填寫了項目名稱和項目URL。因此,他可以更正它們。

下面,我想爲每個爲此項目創建的頁面顯示一個填充表單,以及幾個用於創建新表單的空表單。

會發生什麼情況,所有初始數據都會正確顯示,但是當我填充多個空表單時 - 每次只保存第一個空表單。

+0

不應該有任何需要遍歷formset表單來檢查有效性並保存它們。只要做'如果formset.is_valid():formset.save()'。如果formset.is_valid() \t \t表單集= formset_f(request.POST) \t \t: –

+0

@DanielRoseman改變了我的視圖: '如果request.method == 'POST' \t \t \t formset.save() (): \t \t if form.is_valid(): \t \t \t form.save()'。 根本沒有保存。 –

+0

那麼,formset中的表單可能無效。你是否在模板中顯示錯誤? –

回答

0

這裏是它是如何解決:

  1. 納入的錯誤正確。
  2. 看到倒數第二個形式缺乏所需的字段(hiddenInput)
  3. 在視圖中進行更改,以便它看起來像:

    formset_f = modelformset_factory(ProjectPage, form=ProjectPageForm, extra=3) 
    
    formset = formset_f(queryset=ProjectPage.objects.filter(page_project__id=proj), initial =[{'page_project': proj}, {'page_project': proj}, {'page_project': proj}]) 
    

初始值現在匹配的額外形式的數量 - 每一種形式得到它是自己的外鍵。

可能有更好的解決方案,但問題找到並解決了我!

相關問題