2017-03-27 16 views
0

管理パネルで、私のPersonをCompleteClassモデルに追加できます。 CompleteClassとPersonの間にはM2M関係があります。しかし、私のフォームはそれほどうまくいかない。 pub_dateが更新され、head_countは保存できますが、ModelMultipleChoiceField(人物)は保存できません。保存されません。ここでModelMultipleChoiceFieldを持つフォームがデータを保存していません。

models.py

class Person(models.Model): 
    name = models.CharField(max_length=255) 
    persona_description = models.CharField(max_length=255) 
    def __str__(self): 
     return self.name 

class CompleteClass(models.Model): 
    persons = models.ManyToManyField(Person) 
    class_name = models.CharField(max_length=255) 
    class_head_count = models.IntegerField() 
    class_pub_date = models.DateField() 

    def __str__(self): 
     return '%s %s' % (self.class_name, self.class_head_count) 

    def save_complete_class(self): 
     self.class_pub_date = timezone.now() 
     self.save() 

    class Meta: 
     ordering = ('class_pub_date',) 

はviews.pyです:

def class_new(request): 
    if request.method == "POST": 
     form = CompleteClassForm(request.POST) 
     if form.is_valid(): 
      complete_class = form.save(commit=False) 
      complete_class.class_pub_date = timezone.now() 
      complete_class.save() 
      form.save_m2m() 
      return redirect('class_detail', pk=complete_class.pk) 
    else: 
     form = CompleteClassForm() 
    return render(request, 'app/class_edit.html', {'form': form}) 

とforms.py

class CompleteClassForm(forms.ModelForm): 
    class Meta: 
     model = CompleteClass 
     fields = ('class_name', 'class_head_count',) 
    def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user', None) 
     super(CompleteClassForm, self).__init__(*args, **kwargs) 
     self.fields['class_persons']=forms.ModelMultipleChoiceField(queryset=Person.objects.all()) 

私はドキュメントを読んで以来、及びsave_m2mを使用しました私はコミット= falseを設定しました。

POSTデータには個人データが含まれていますが、データベースに書き込まれていません。私は困惑している。助けてください!

答えて

1

fieldsタプルで指定されたフィールドのみがインスタンスに保存されます。そこにm2mフィールドが表示されていません。

また、人物の代わりに別の名前 - class_personsを使用してmodelchoicefieldを定義します。実際には、フィールドを個別に定義する必要はありません。デフォルトの属性は変更していません。

そしてその定義を削除したら、__init__を上書きする理由もありません。ユーザーパラメータを渡すことは決してありませんし、フォームのどこにでも使用することはありません。

+0

ちょうど複雑だと思うときは簡単です。簡単です。ありがとうございました。 – Kickasstimus

関連する問題