Как я могу передать несколько параметров в моем URL - PullRequest
1 голос
/ 20 апреля 2020

Итак, я разработчик 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

1 Ответ

1 голос
/ 21 апреля 2020

Хорошо, я в конечном итоге выяснил свою проблему. Итак, я ошибался, передавая Conversation.pk, а не другим пользователям pk. Передавая разговор pk, я не смог фильтровать только сообщения между двумя пользователями, но получал сообщения, которые не были эксклюзивными между двумя пользователями. И ПК для разговора всегда будет иметь меньше ПК, чем пользователи. Может быть 3 объекта разговора, но 5 пользователей с разными ПК. В любом случае, решение было просто изменить conversation.pk на member.pk, как в сообщениях. 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:messages' member.pk %}">Start messaging </a>
        <br><br>
    {% endif %}{% endfor %}

</li>
{%endfor %}

А затем я настроил свое сообщение. html, чтобы отфильтровать между request.user и other_user

{% for message in messages %}



        {% if message.sender_id == request.user.id %}
        <li class="text-right list-group-item"> {{ message.message }}<br>{{ message.date }} </li>
        {% elif message.sender_id == profile.id %}
        <li class="text-left list-group-item"> {{ message.message }}<br>{{ message.date }} </li>

        {% endif %}



{%endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...