2011-06-26 2 views
1

Je sens que mon problème est tout à fait évident et a une solution triviale, mais je ne peux pas le trouver pour quelques heures ...Django modelmultiplechoicefield non liés tous les objets qui ne sont pas à queryset

par exemple réaliste Imaginons que j'ai modèles suivants:

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) 

Il existe donc des rapports et des publications. Les messages peuvent être associés à un rapport. Et il y a le formulaire suivant pour limiter/non lié des messages aux rapports.

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',) 

donc je passe paramètre supplémentaire (utilisateur) pour former et lorsque l'utilisateur ouvre avec cette forme, il ne peut lié/non lié ses propres messages.

Tout fonctionne bien, sauf une chose: lorsque l'utilisateur enregistre le formulaire - tous les messages des autres utilisateurs qui étaient liés à ce rapport ne sont plus liés. Ce n'est pas ce dont j'ai besoin. J'ai besoin que cet utilisateur puisse lier/délier uniquement ses propres messages au rapport, mais les messages des autres utilisateurs ne réinitialisent pas leur état.

Merci pour toute aide.

EDIT: voici la vue (ce n'est pas le point de vue réel, mais la logique de vue réelle est exactement le même)

@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

Pouvez-vous poster votre code d'affichage pour l'exemple complet? – Udi

+0

ouais, j'ai ajouté le code de vue – kasitan

Répondre

1

Je ne sais pas d'un « très facile » façon de résoudre votre problème . J'aurais utilisé myform.save(commit=False) (de la vue) et au lieu d'appeler le myform.save_m2m() intégré, appelez une méthode personnalisée AddPostsToReport.save_posts() qui boucle à travers self.instance['posts'], supprimant les messages pour l'utilisateur spécifié pas dans self.cleaned_data['posts'] et plus tard ajouter les nouveaux messages restants.

Questions connexes