2011-06-26 6 views
1

ではありませんでした結合していないすべてのオブジェクト...Djangoは現実的な例のために、私は私の問題は非常に明白で、自明な解を持っている感じが、私は数時間のためにそれを見つけることができないクエリセット

をmodelmultiplechoicefieldのは、私が持っている想像してみましょう次のモデル:

class Report(models.Model): 
    title = models.CharField(max_length=60) 
    author = models.ForeignKey(User) 
    posts = models.ManyToManyField(Post) 

class Post(models.Model): 
    title = models.CharField(max_length=100) 
    author = models.ForeignKey(User) 

報告と投稿があります。投稿はいくつかのレポートに関連付けることができます。 そして、レポートへの投稿のバウンダリ/アンバウンディングのためのフォームがあります。

class AddPostsToReport(ModelForm): 
    def __init__(self, user, *args, **kwargs): 
     super(AddPostsToReport, self).__init__(*args, **kwargs) 
     self.fields['posts'] = forms.ModelMultipleChoiceField(
      queryset=Post.objects.filter(author=user), 
      required=False, 
      widget=forms.CheckboxSelectMultiple) 

    class Meta: 
     model = Report 
     fields = ('posts',) 

私はフォームに追加のパラメータ(ユーザー)を渡します。このフォームでユーザーがページを開くと、自分の投稿のみをバインド/アンバインドできます。

1つのこと以外はすべて正常に動作します。ユーザーがフォームを保存すると、そのレポートにバインドされる前の他のすべての投稿はアンバウンドになります。それは私が必要とするものではありません。そのユーザーは自分の投稿のみをレポートにバインド/アンバインドできる必要がありますが、他のユーザーの投稿は状態をリセットしません。

ありがとうございました。

編集:ここで図である(それが本当のビューではないのですが、実際のビューのロジックがまったく同じである)

@login_required 
def report_add_posts(request, report_id): 
    report = get_object_or_404(Report, pk = report_id) 

    if request.method == 'POST': 
     form = AddPostsToReport(request.user, request.POST, instance = report) 

     if form.is_valid(): 
      form.save() 

      return HttpResponseRedirect(reverse(...)) 
    else: 
     form = AddPostsToReport(request.user, instance = report) 

    return render_to_response('report/page_with_form_to_add_posts.html', 
           { 'form': form, 
           'report': report }, 
           context_instance=RequestContext(request)) 
+0

完全な例のビューコードを投稿できますか? – Udi

+0

ええ、私はビューコードを追加 – kasitan

答えて

1

私はあなたの問題を解決するために、「非常に簡単」な方法を知りません。私はmyform.save(commit=False)(ビューから)を使用し、myform.save_m2m()に組み込まれたものを呼び出すのではなく、self.instance['posts']をループするカスタムAddPostsToReport.save_posts()メソッドを呼び出し、self.cleaned_data['posts']にはない投稿を削除し、残りの新しい投稿を追加します。

関連する問題

 関連する問題