2017-04-09 14 views
0

Djangoのinlineformset_factoryを使用してフォームを設定しようとしています。モデルは多対1の関係で設定され、各ユーザーには多くのケースがあります。私は、ユーザーがケースを追加したい。Django:ユーザーと多対1の関係を持つinline_formsetを使用してフォームを作成する方法

私はthis site

models.py

class Case(models.Model): 
    date_due = models.DateField() 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 

forms.py

CaseFormset = inlineformset_factory(User,Case, 
            fields=('date_due',), 
            can_delete = True) 

class CaseForm(forms.ModelForm):  
    class Meta: 
     model = Case 
     fields = ('date_due',) 

views.py

@login_required 
def add_case(request): 
    if request.method == 'POST': 
     form = CaseForm(request.POST) 
     if form.is_valid(): 
      case = form.save(commit = False) 
      case_formset = CaseFormset(request.POST, instance = case) 
      if case_formset.is_valid(): 
       case.save() 
       case_formset.save() 
      return redirect('index') 
     else: 
      print(form.errors) 
    else: 
     form = CaseForm() 
     case_formset = CaseFormset(instance = Case()) 
    return render(request, 'cases/add_case.html', 
        {'form':form, 'case_formset':case_formset}) 

add_case.htmlからの一般的なアウトラインを踏襲しています

<!DOCTYPE html> 
{% load staticfiles %} 
<html> 

    <head> 
     <body> 
      <form method="post"> 
       {% csrf_token %} 
       {{ form.as_p }} 
       {{ case_formset.as_p }} 
       {{ case_formset.management_form }} 
       <button type="submit">Save changes</button> 
      </form> 
     </body> 
    </head> 
</html> 

私は私が行っているフォームセットにmanagement_formを追加する必要があるように見えるのドキュメントを読む

Exception Type: ValidationError 
Exception Value:  
['ManagementForm data is missing or has been tampered with'] 

を取得しています。どこに間違っているのか分からない。

Iはまた、上記とはわずかに異なる見え、インスタンスとしてユーザーを使用してフォームセットを作成しようとしたthe docs

異なるアプローチを試みました。どちらのアプローチが望ましいか分かりません。

私には2つの質問があります。

  1. なぜ私は上記のエラーが発生していますか?
  2. 大文字小文字の代わりにformsetをuserのインスタンスに設定する必要がありますか?

おかげ

+0

ようcase.user = request.user

のでviews.pyルックスを追加する必要が?あなたはフォームだけではなく、管理フォームを出力しました。 –

+0

@Roseman修正を加えましたが、エラーは継続します –

答えて

0

は、私はそれを考え出しました!

はviews.pyでは、私は、テンプレート内のフォームセットの残りの部分だ

@login_required 
def add_case(request): 
    if request.method == 'POST': 
     form = CaseForm(request.POST) 
     if form.is_valid(): 
      case = form.save(commit=False) 
      case.user = request.user 
      case_formset = CaseFormset(request.POST, instance = case) 
      if case_formset.is_valid(): 
       case.save() 
       case_formset.save() 
      return redirect('index') 
     else: 
      print(form.errors) 
    else: 
     form = CaseForm() 
     case_formset = CaseFormset(instance = Case()) 
    return render(request, 'cases/add_case.html', 
        {'form':form, 'case_formset':case_formset}) 
関連する問題