Итак, я разработчик noob ie и создаю свой первый проект с нуля. В настоящее время я создаю систему обмена сообщениями для моего приложения. Предполагается, что пользователь должен перейти по ссылке, которая проверяет его текущие разговоры, чтобы они отображались. Затем из разговоров, есть ссылка, которая ведет их на страницу, которая отображает содержание этого разговора. Но у меня здесь проблема, потому что, когда я пытаюсь заставить pk другого пользователя отображать свои сообщения, мой код вместо этого получает request.user
pk и получает ВСЕ сообщения, которые текущий пользователь отправляет не только между двумя пользователями. в этом конкретном c разговоре. Теперь, когда я вручную и вручную имею в виду ввод фактического pk указанного пользователя c, я хочу проверить, есть ли сообщения с моим пользователем, когда я вручную ввожу их номер pk в http, я могу получить правильные сообщения и эксклюзивные сообщения. В настоящее время моя ссылка href проходит conversation.pk
, и я не понял, как получить pk других пользователей. Все, что я пробовал, продолжало проходить мой request.user
рк. Итак, я думаю, что я спрашиваю, как я могу передать другим пользователям pk с моим URL? Я предполагаю, что мне нужно сохранить разговор.pk и добавить других пользователей pk в качестве другого параметра. Или есть другой способ сделать это? Возможно, добавив дополнительные логи c на мой взгляд? Или в шаблоне? Я довольно застрял здесь.
views.py / message и messages
#displays active conversations
def messages(request,profile_id):
conversations = Conversation.objects.filter(
members= request.user
).annotate(
last_message=Max('instantmessage__date')
).prefetch_related('members').order_by(
'-last_message'
)
#displays contents of conversations, messages
def message(request, profile_id):
receiver = get_object_or_404(Profile,id=profile_id)
exclusive_conversations = Conversation.objects.filter(members= request.user ).filter(members= receiver)
messages = InstantMessage.objects.filter(receiver__in=exclusive_conversations)
context = {'messages' : messages, }
return render(request, 'dating_app/message.html', context)
urls.py / message, messages
path('message/<int:profile_id>/', views.message, name='message'),
path('messages/<int:profile_id>/', views.messages, name='messages'),
]
сообщений. html
{% for conversation in conversations%}
<li class="text-right list-group-item">
{% for member in conversation.members.all %}{% if member != user %}
{{ member.username }}
<a href="{% url 'dating_app:message' conversation.pk %}">Start messaging </a>
<br><br>
{% endif %}{% endfor %}
</li>
{%endfor %}
сообщение. html
{% for message in messages %}
{% if message.sender_id == request.user.id %}
<li class="text-right list-group-item"> {{ message.message }}<br>{{ message.date }} </li>
{% else %}
<li class="text-left list-group-item"> {{ message.message }}<br>{{ message.date }} </li>
{% endif %}
{%endfor %}
** models.py **
class ProfileManager(BaseUserManager):
def create_user(self, username, email,description,photo, password=None):
if not email:
raise ValueError("You must creat an email")
if not username:
raise ValueError("You must create a username!")
if not description:
raise ValueError("You must write a description")
if not photo:
raise ValueError("You must upload a photo")
user = self.model(
email=self.normalize_email(email),
username = username,
description= description,
photo= photo,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, username, email,description,photo, password):
user = self.create_user(
email=self.normalize_email(email),
password=password,
username=username,
description=description,
photo=photo,
)
user.is_admin=True
user.is_staff=True
user.is_superuser=True
user.save(using=self._db)
return user
class Profile(AbstractBaseUser):
class Meta:
swappable = 'AUTH_USER_MODEL'
email = models.EmailField(verbose_name="email")
username = models.CharField(max_length=30, unique=True)
date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
#what I added
description = models.TextField()
photo = models.ImageField(upload_to='profile_photo',blank=False, height_field=None, width_field=None, max_length=100)
matches = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='+', blank=True)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['description','photo','email']
objects = ProfileManager()
def __str__(self):
return self.username
def has_perm(self, perm, obj=None):
return self.is_admin
def has_module_perms(self,app_label):
return True
class UserVote(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
voter = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='given_vote', on_delete=models.CASCADE)
vote = models.BooleanField(default=False)
class Meta:
unique_together = (('user', 'voter'))
class Conversation(models.Model):
members = models.ManyToManyField(settings.AUTH_USER_MODEL)
class InstantMessage(models.Model):
sender = models.ForeignKey(settings.AUTH_USER_MODEL, related_name= 'senderr',on_delete=models.CASCADE )
receiver = models.ForeignKey(Conversation, on_delete=models.CASCADE)
message = models.TextField()
date = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
return self.message
#tests to see if messages are exclusive between sender, receiver
@classmethod
def find_messages_exclusive_to_profile(cls,sender,receiver):
#members = receiver AND sender, not receiver or sender
exclusive_conversations = Conversation.objects.filter(members= receiver ).filter(members= sender)
exclusive_messages = InstantMessage.objects.filter(receiver__in=exclusive_conversations)
return exclusive_messages