#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 вещи
- Другие люди отправили запрос на ваш пост
- вы отправили запрос на сообщение других людей
- никто ничего не отправил (что, вероятно, будет по умолчанию)
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
бы переменную хранить одно значение объекта, например:
account = request.user # if you are logged in and trying to get your own account
- Передайте переменную
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-минутного сеанса чата, ХАХАХА