2010-06-11 9 views
1

J'ai une application en classe, et une relation de suivi. Les utilisateurs peuvent se suivre et créer des salles de classe. Lorsqu'un utilisateur crée une salle de classe, il peut inviter uniquement les personnes qui le suivent. Le modèle Classroom est une table m2m to User.Django m2m apparaissant champs

J'ai dans les modèles. py:

et models.py de l'application suivante:

class Relations(models.Model):  
    initiated_by = models.ForeignKey(User, editable=False) 
    date_initiated = models.DateTimeField(auto_now=True, editable = False) 
    follow = models.ForeignKey(User, editable = False, related_name = "follow") 
    date_follow = models.DateTimeField(auto_now=True, editable = False) 

et views.py de l'application de la classe:

def save_classroom(request, username): 

    if request.method == 'POST': 
     u = User.objects.get(username=username) 
     form = ClassroomForm(request.POST, request.FILES) 
     if form.is_valid(): 
      new_obj = form.save(commit=False) 
      new_obj.creator = request.user 
      r = Relations.objects.filter(initiated_by = request.user) 
     # new_obj.members = 
      new_obj.save() 
      return HttpResponseRedirect('.')  
    else: 
      form = ClassroomForm()  
    return render_to_response('classroom/classroom_form.html', { 
      'form': form, 

      }, 
      context_instance=RequestContext(request)) 

J'utilise un ModelForm pour le formulaire de classe, et la vue par défaut, en tenant compte de ma relation many to many avec la table User, dans le champ Members, est une liste de tous les utilisateurs de ma base de données. Mais je veux seulement dans cette liste les utilisateurs qui sont dans une relation de suivi avec l'utilisateur connecté - celui qui crée la salle de classe. Comment puis-je faire cela?

p.s: aussi, quand je suis sauver la forme, il sauve, mais sans "membres"

Merci!

+0

où vous voulez cette liste, dans l'admin django? ou dans un gabarit? – eos87

+0

dans le modèle :) – dana

Répondre

1

Vous devez changer la queryset qui est utilisé pour alimenter le formfield ... Mettez ce qui suit dans votre classe de formulaire:

def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user') 
     super(ClassroomForm, self).__init__(*args, **kwargs) 
     relations = Relations.objects.filter(initiated_by=user) 
     self.fields["members"].queryset = \ 
      User.objects.filter(pk__in=[r.follow.pk for r in relations]) 

Pour obtenir l'utilisateur en cours dans la méthode __init__ de la forme, changer sa initsialisation en votre save_classrom vue:

 form = ClassroomForm(request.POST, request.FILES, user=request.user) 
     # and after the else: 
     form = ClassroomForm(user=request.user)  

Je ne suis pas tout à fait sûr de la requête pour obtenir les utilisateurs de votre domaine, mais je pense qu'il faut vérifier que initiated_by est l'utilisateur connecté?

Pour enregistrer les relations m2m, vous devez également appeler form.save_m2m()!

+0

yes, started_by devrait être l'utilisateur actuellement connecté. merci beaucoup pour la réponse. Je vais essayer de cette façon en ce moment – dana

+1

Eh bien comme je l'ai dit, je ne suis pas totalement sûr de la requête, mais je pense que si je comprends bien obtenir les relations pour cet utilisateur, puis prendre l'utilisateur qui sont là dans le " suivre "relation devrait être la bonne façon? Vous devriez également utiliser aucun espace dans le nom associé (utilisez un trait de soulignement à la place). Et le nom associé pour "follow" devrait probablement plus quelque chose comme "relations" (de sorte que user.relations.all() retournera toutes ses relations)? –

+0

de toute façon, j'ai une erreur bizarre: d'abord, j'ai ajouté une requête en paramètre dans def __init__, pour une autre manière, request.pop ('user') n'a pas été reconnu. Mais maintenant, même si j'inclue après 'else' dans le formulaire de vue = ClassroomForm (user = request.user), cela me donne l'erreur: __init __() prend au moins 2 arguments non-mot-clé (1 donné) – dana

Questions connexes