2010-12-30 16 views
12

Estoy usando el sistema de autorización de Django para hacer cuentas en mi aplicación.La mejor manera de hacer que el sistema de "usuario" de Django tenga "amigos"

¿Cuál es la mejor manera de hacer un sistema de "amigos" utilizando el sistema de autorización? Deseo poder vincular a los Usuarios, pero primero deben aceptar la solicitud de amistad, y también deseo mantener la fecha en que se hicieron amigos.

Respuesta

17

Un campo M2M casi lo lleva hasta allí, pero solo almacenará la relación, no la fecha en que fue creada. Sería mucho más simple si puedes arreglártelas sin la fecha de la amistad.

Si no usted desea crear un modelo algo como esto:

class Friendship(models.Model): 
    created = models.DateTimeField(auto_now_add=True, editable=False) 
    creator = models.ForeignKey(User, related_name="friendship_creator_set") 
    friend = models.ForeignKey(User, related_name="friend_set") 

Usted desea crear un método, probablemente en el user profile model de dar sentido a las relaciones. Idealmente, se debe obtener algo como esto:

>> User.userprofile.friends() 
[{'name': "Joe", 'created': 2010-12-01},] 
+0

que tienen el módulo de perfil de carga, y yo soy el almacenamiento de la información adicional en el modelo PerfilUsuario. Quiero vincular el modelo UserProfile a esta amistad. ¿No puedo usar "a través" para unirlos? – dotty

+1

No tiene que vincular el perfil de usuario a la amistad. Ya tiene el usuario, por lo que puede consultar Friendship.objects.filter (Q (creador = usuario) | Q (amigo = usuario)). All() – Tiago

+0

@dotty - Desea vincular el modelo de "amistad" con el Modelo de usuario El modelo UserProfile será un lugar más conveniente para poner un método de friends(), porque es realmente difícil crear una subclase del modelo de usuario. –

1
class UserProfile(models.Model): 

    user = models.ForeignKey(User, unique=True) 
    #other fields 

    def get_friends(self): 
     user = self.user 
     return Friendship.objects.filter(Q(creator=user)|Q(friend=user)) 


    #then you can call elsewhere 

    friends = user.get_profile().get_friends().all() 
+0

¿Cómo sería la Amistad? – dotty

+0

Amistad quisiera que C. Alan Zoppa respondiera. – Tiago

+2

En este ejemplo, el método get_friends devuelve objetos de amistad, no objetos de usuario. –

5

te he hecho esto:

models.py

class FriendMgmt(models.Model): 
    """ 
     friends table 
    """ 
    user = models.ForeignKey(User) 
    friend = models.ForeignKey(User, related_name="friends") 

forms.py

class FriendMgmtForm(forms.Form): 
    """ 
     Manages friends connections 
    """ 
    friend = forms.CharField(max_length=100,required=False) 

vistas .py

def my_friends(request): 
    """ 
     used for Displaying and managing friends 
    """ 
if request.method == 'POST': 

    form = FriendMgmtForm(request.POST) 
    if form.is_valid(): 

     user = User.objects.get(id=80) 
     friend_manage = FriendMgmt(user=request.user, friend= user) 
     friend_manage.save() 

     return HttpResponseRedirect('/myfriends/') 

else: 
    form = PdfValidationForm() 

user = request.user 
profile = UserProfile.objects.get(user=user) 
full_name = user.get_full_name() 
email = user.email 
area_interest = profile.area_of_interest 
designation = profile.designation 
friends = FriendMgmt.objects.filter(user=request.user) 


return render_to_response('friends.html',{'form': form, 
             'full_name':full_name, 
             'email':email, 
             'area_interest':area_interest, 
             'designation':designation, 
             'friends':friends, 

             } 
         ) 

url.py

url(r'^myfriends/$',my_friends) 
Cuestiones relacionadas