Почему мой запрос на отправку интереса не отображается? Похоже, что переменные, которые я определил, не работают

#python #html #django #django-models #django-templates

#питон #HTML #джанго #django-модели #django-templates

Вопрос:

Ошибка значения в /HomeFeed/slug-1/detail/ Значение набора запросов для точного поиска должно быть ограничено одним результатом с использованием нарезки. interest_list = InterestList.objects.get(interestuser= учетная запись)

В моем коде есть несколько ошибок, и эта ошибка — только одна из них…

В моем проекте люди публикуют сообщения в блогах, а люди, которые читают сообщение в блоге и которым оно нравится, могут отправлять «запрос на интерес», возможно, чтобы прокомментировать больше о сообщении в блоге, а создатель сообщения в блоге может принять или отклонить этот запрос на интерес. По сути, это что-то вроде запроса на добавление в друзья, за исключением того, что отправляемый вами запрос — это ваши «мысли» в форме. Я пытаюсь изменить свой код, создавая свою систему отношений, чтобы вписаться в эту «систему отправки интереса».

Всего у меня есть 4 модели, одна для сообщений, одна — модель моей учетной записи пользователя, одна — список интересов, а вторая — запрос интереса.

Есть 4 основные функции: принять запрос, отклонить запрос (если вы создатель сообщения в блоге) и отправить и отменить отправку запроса (если вы заинтересованный пользователь)

Мне сложно связать интерес к сообщению в блоге с моделью учетной записи, чтобы интерес отправлялся на это конкретное сообщение в блоге.

Есть 5 вещей, на которые следует обратить внимание, если вы хотите понять мой код

  • is_myself = True означает, что вы просматриваете свой собственный пост
  • is_others = True означает, что вы просматриваете сообщение участника принятого запроса (иначе ваш интерес был принят)
  • is_others = False может означать 3 вещи
    1. Другие люди отправили запрос на ваш пост
    2. вы отправили запрос на сообщение других людей
    3. никто ничего не отправил (что, вероятно, будет по умолчанию)

models.py

 class InterestList(models.Model):
   interestuser = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="interestuser")
   interests = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name="interests") 

   def __str__(self):
      return self.interestuser.username

   def add_interest(self, account):

      if not account in self.interests.all():
         self.interests.add(account)
         self.save()

   def remove_interest(self, account):

      if account in self.interests.all():
         self.interests.remove(account)


class InterestRequest(models.Model):
   interestsender               = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="interestsender")
   interestreceiver             = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="interestreceiver")
   is_active            = models.BooleanField(blank=False, null=False, default=True)
   timestamp        = models.DateTimeField(auto_now_add=True)
   my_name           = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
   my_thoughts         = models.TextField(max_length=5000, null=False, blank=False)

   def __str__(self):
      return self.interestsender.username
     
   def accept(self):
      receiver_interest_list = InterestList.objects.get(user=self.interestreceiver)
      if receiver_interest_list:
         receiver_interest_list.add_interest(self.interestsender)
         sender_interest_list = InterestList.objects.get(user=self.interestsender)
         if sender_interest_list:
            sender_interest_list.add_interest(self.interestreceiver)
            self.is_active = False
            self.save()

   def decline(self):
      self.is_active = False
      self.save()

   def cancel(self):
      self.is_active = False
      self.save()

class BlogPost(models.Model):
 chief_title                    = models.CharField(max_length=50, null=False, blank=False)
 body                   = models.TextField(max_length=5000, null=False, blank=False) 
 likes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='blog_posts', blank=True)
 slug                   = models.SlugField(blank=True, unique=True)
 author                     = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)



class Account(AbstractBaseUser):
 email                  = models.EmailField(verbose_name="email", max_length=60, unique=True)
 username               = models.CharField(max_length=30, unique=True)

 

views.py

 def detail_blog_view(request, slug):

    context = {}
#need to import a package get_object_or_404. return object or throw 404
    blog_post = get_object_or_404(BlogPost, slug=slug)
    total_likes = blog_post.total_likes()
    liked = False
    if blog_post.likes.filter(id=request.user.id).exists():
        liked = True
    context['liked'] = liked
    context['blog_post'] = blog_post
    context['total_likes'] = total_likes
    account = Account.objects.all()
    context['account'] = account

    try:
        interest_list = InterestList.objects.get(interestuser=account)
    except InterestList.DoesNotExist:
        interest_list = InterestList(interestuser=account)
        interest_list.save()
    interests = interest_list.interests.all()
    context['interests'] = interests

    is_myself = True
    is_others = False
    request_sent = InterestRequestStatus.NO_REQUEST_SENT.value
    interest_requests = None
    user = request.user
    if user.is_authenticated and blog_post.author != user:
        is_myself = False
        if interests.filter(pk=user.id):
            is_others = True
        else:
            is_others = False
            #CASE 1: THEY HAVE SENT A REQUEST TO YOU
            if get_interest_request_or_false(sender=account, receiver=user) != False:
                request_sent = InterestRequestStatus.THEM_SENT_TO_YOU.value
                context['pending_interest_request_id'] = get_interest_request_or_false(sender=account, receiver=user).id #or you can use pk instead of id
            #CASE 2: REQUEST SENT FROM YOU TO THEM
            if get_interest_request_or_false(sender=account, receiver=user) != False:
                request_sent = InterestRequestStatus.YOU_SENT_TO_THEM.value
            #CASE 3: NTH HAS BEEN SENT
            else:
                request_sent = InterestRequestStatus.NO_REQUEST_SENT.value
   

    elif not user.is_authenticated:
        is_myself = False
    #when you are looking at your own post
    else:
        try:
            interest_requests = InterestRequest.objects.filter(receiver=user, is_active=True)
        except:
            pass

    context['is_myself'] = is_myself
    context['is_others'] = is_others
    context['request_sent'] = request_sent
    context['interest_requests'] = interest_requests
    context['BASE_URL'] = settings.BASE_URL

    return render(request, 'HomeFeed/detail_blog.html', context)
 

utils.py

 from HomeFeed.models import InterestRequest

def get_interest_request_or_false(interestsender, interestreceiver):
    try:
        return InterestRequest.objects.get(interestsender=interestsender, interestreceiver=interestreceiver, is_active=True)
    except InterestRequest.DoesNotExist:
        return False

 

interest_request.py

 from enum import Enum

class  InterestRequestStatus(Enum):
 NO_REQUEST_SENT = -1 #no request sent in that blog post to you or to them. this is the constant, how it should normally look like for most posts
 THEM_SENT_TO_YOU = 0
 YOU_SENT_TO_THEM = 1

 

шаблон html

 {% if request.user.is_authenticated %}
<div class="d-flex flex-column mb-4" >

  <!-- THEM to YOU -->
  {% if request_sent == 0 %}
  <div class="card m-2 p-4" >
   <div class="d-flex flex-row align-items-center">
    <span class="friend-text align-items-center mr-2">Accept Member Request</span>
    <span id="id_cancel_{{id}}" class="decline-friend-request material-icons p-1" onclick='triggerDeclineFriendRequest("{{pending_friend_request_id}}")'>cancel</span>
      <span id="id_confirm_{{id}}" class="confirm-friend-request material-icons p-1" onclick='triggerAcceptFriendRequest("{{pending_friend_request_id}}")'>check</span>
   </div>
  </div>
  {% endif %}




  <div class="card m-2 px-4 pb-4">
    <!-- Cancel Friend Request / Send Friend Request / Remove Friend -->
    {% if is_others == False and is_myself == False %}
      <!-- You sent them a request -->
      {% if request_sent == 1 %}
      <div class="d-flex flex-column align-items-center pt-4">
       <button class="btn btn-danger" id="id_cancel_friend_request_btn">
        Cancel Interest Request
       </button>
      </div>
      {% endif %}
      <!-- No requests have been sent -->
      {% if request_sent == -1 %}
      <div class="d-flex flex-column align-items-center pt-4">
       <button class="btn btn-primary" id="id_send_friend_request_btn">
        Send Interest Request
       </button>
      </div>
      {% endif %}
    {% endif %}
   
  {% if is_others %}
   <div class="dropdown pt-4 m-auto">
    <button class="btn btn-secondary dropdown-toggle friends-btn" type="button" id="id_friends_toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
    Accepted Members
    </button>
    <div class="dropdown-content" aria-labelledby="id_friends_toggle">
     <a class="dropdown-item" href="#" onclick="removeFriend('{{id}}', onFriendRemoved)">Remove Member</a>
    </div>
   </div>
  {% endif %}


  {% endif %}

 

urls.py

   path('<slug>/detail/', detail_blog_view, name= "detail"),

 

Ответ №1:

ПРОБЛЕМА

Эта ошибка, которую вы описали в начале, появляется, потому что вы пытаетесь запросить модель с помощью queryset . В вашем views.py в вашем detail_blog_view у вас есть строка, которая гласит:

 account = Account.objects.all()
 

Здесь значение переменной account является queryset значением ВСЕХ доступных учетных записей, затем вы пытаетесь запросить свою базу данных, используя этот набор запросов с get помощью метода here:

 interest_list = InterestList.objects.get(interestuser=account)
 

Поскольку ваше interestuser поле является one2one отношением, оно может принимать только ** один ** объект в запросе, пока вы передаете queryset .

РЕШЕНИЕ

Все, что вам нужно сделать, это вместо использования account = Account.objects.all() написать запрос, который заставил account бы переменную хранить одно значение объекта, например:

  1. account = request.user # if you are logged in and trying to get your own account
  2. Передайте переменную pk (пользователя, для которого вы хотите получить список) в URL-адрес следующим образом:
      urlpatterns = [
         path('detail_blog_view/<int:pk>/', views.detail_blog_view, name="detail_blog_view"),
     ]
     

затем, когда вы создаете ссылки на свои detail_blog_view страницы, напишите что-то вроде этого:

 <a href="{% url 'detail_blog_view' user.pk %}">{{ user.username }}</a> # here i'm passing a known user.pk from the context of the view that stores this template.
 

и, в конце концов, в вашем представлении запрашивайте ваш account запрос с pk помощью переданного следующим url образом:

 account = Account.objects.get(pk=pk)
 

Комментарии:

1. Привет, мой спаситель! могу ли я не добавлять ничего нового в свой URL?

2. потому что, как вы можете видеть из моего url.py у меня уже есть slug в моем URL-адресе. в основном все мои URL-адреса, связанные с постами, имеют slug, поэтому, если я вместо этого изменю его на pk, мне придется научиться запрашивать свои данные, и, как вы знаете, я очень плох в этом, ха-ха..

3. Да, но этот пул предназначен для ссылки на сообщение в блоге, брат, вы пытаетесь запросить один Account объект, поэтому вам придется использовать некоторую переменную для запроса, и единственный способ получить эту переменную — из GET запроса в вашем URL, поэтому вам нужно либо передать Account объект pk, либо использоватьдля request.user запроса вашей учетной записи

4. В качестве альтернативы вы можете добавить связь с Account моделью в своей BlogPost модели, чтобы вы могли получить все объекты интереса для публикации, используя что-то вроде этого: account = blog_post.account

5. ха-ха, прости, брат, я думаю, ты меня потерял, потому что я знаю, что ты прав, но я совершенно не понимаю, что ты имеешь в виду и как изменить мой код, извините! Как насчет 5-минутного сеанса чата, ХАХАХА