2016-08-03 8 views
1

ModelFormが提出された後、外部キー関係を追加して検証するにはどうすればよいですか?djangoフォーム提出後に外部キー値を追加

models.py

class Comment(models.Model): 
    id = models.AutoField(primary_key=True) 
    activity = models.ForeignKey(Activity) 
    submitter = models.ForeignKey(User) 

    creation_date = models.DateTimeField(auto_now_add=True) 
    content = models.TextField() 

forms.py

class CommentForm(forms.ModelForm): 
    content = forms.CharField(widget=forms.Textarea) 

    class Meta: 
     model = Comment 

views.py

def index(request, id=None): 
    activity_instance = Activity.objects.get(pk=1) 
    submitter_instance = User.objects.get(id=1) 

    newComment = CommentForm(request.POST) 
    newComment.activity = activity_instance 
    newComment.submitter = submitter_instance 

    if newComment.is_valid():  # <-- false, which is the problem 

答えて

5

私はあなたがモデルのインスタンスで、フォームのインスタンスを混合していると思います。 newCommentはフォームです。他のオブジェクトをフォーム属性として割り当てても、フォームデータはすべてform.data(データ構造のようなもの)に保存されるため、外部キーを保存することはできません。

外部キーを除外しないためにフォームがどのように表示されるのかわからないので、ドロップダウンリストとして表示して選択する必要があります。あなたが現在そうであるように、ユーザーが外部キーを選択しても値を割り当てることを選択したくない場合は、フォームでそれらを除外しなければならないので、form.is_valid()は渡す:

class CommentForm(forms.ModelForm): 
    content = forms.CharField(widget=forms.Textarea) 

    class Meta: 
     model = Comment 
     exclude = ('activity', 'submitter') 

views.py

def index(request, id=None): 
    activity_instance = Activity.objects.get(pk=1) 
    submitter_instance = User.objects.get(id=1) 

    comment_form = CommentForm(request.POST) 
    if comment_form.is_valid(): 
     new_comment = comment_form.save(commit=False) 
     new_comment.activity = activity_instance 
     new_comment.submitter = submitter_instance 
     new_comment.save() 

Django doc about save() method

+0

ありがとう、非常に明確で有用です。 – smilebomb

関連する問題