2010-12-30 3 views
12

Я использую систему авторизации Django для создания учетных записей в своем приложении.Лучший способ сделать «пользовательскую» систему Django «друзьями»

Каков наилучший способ создания системы «друзей» с использованием системы авторизации? Я хочу, чтобы у меня была возможность связать пользователей вместе, но сначала они должны принять запрос друга, и я также хочу сохранить дату, когда они стали друзьями.

ответ

17

Поле M2M почти доставляет вас туда, но будет хранить только отношения, а не дату его создания. Было бы намного проще, если бы вы могли обойтись без даты дружбы.

В противном случае вы хотите создать модель что-то вроде этого:

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") 

Вы хотите создать метод, вероятно, на user profile model, чтобы разобраться в отношениях. В идеале, он должен получить вам что-то вроде этого:

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

У меня есть модуль профиль загружен, и я храню дополнительную информацию в модели UserProfile. Я хочу связать модель UserProfile с этой дружбой. Не могу ли я использовать «через», чтобы связать их вместе? – dotty

+1

Вам не нужно связывать UserProfile с дружбой. У вас уже есть пользователь, поэтому вы можете запросить Friendship.objects.filter (Q (creator = user) | Q (friend = user)). All() – Tiago

+0

@dotty - Вы хотели бы связать модель дружбы с Модель пользователя. Модель UserProfile будет просто удобнее разместить метод friends(), потому что очень сложно подклассифицировать модель User. –

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

На что похожа Дружба? – dotty

+0

Дружба хотела бы, чтобы С. Алан Зоппа ответил. – Tiago

+2

В этом примере метод get_friends возвращает объекты Дружбы, а не объекты пользователя. –

5

Я сделал это:

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) 

просмотров .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) 
Смежные вопросы