I am working on CS50 Network and am supposed to design a Twitter-like social network website for making posts and following users. In my view's return statement I am trying to render a page and a jsonrespone. The JsonResponse is so javascript can access it. The error I get is: 'tuple' object has no attribute 'get.'
view (this shows a page of all the posts specific to a user. When a logged in user clicks on the username of a post it passes values. This is how the parameters in the view gets its values.):
def profile(request, user_id, username):
# list number of followers and following
profiles = Profile.objects.all()
# get all posts and order them
posts = Post.objects.filter(user=user_id).order_by('-timestamp')
# pagination
pagination = Paginator(posts, 10)
page_num = request.GET.get('page')
try:
pages = pagination.page(page_num)
except EmptyPage and PageNotAnInteger:
pages = pagination.page(1)
# serialize
json_posts = serializers.get_serializer("json")().serialize(posts)
return render(request, "network/profile.html", {
"posts": pages,
"user_id": user_id,
"username": username,
"profiles": profiles,
"currentUser": request.user,
}), JsonResponse(json_posts, safe=False)
models:
from django.contrib.auth.models import AbstractUser
from django.db import models
from django.utils import timezone
class User(AbstractUser):
pass
class Profile(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="Followers_user")
followers = models.ManyToManyField(User, blank=True, null=True,
related_name="Followers_followers")
following = models.ManyToManyField(User, blank=True, null=True,
related_name="Followers_following")
def __str__(self):
return str(self.user)
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="Post_user")
text = models.CharField(max_length=280)
timestamp = models.DateTimeField(default=timezone.now)
likes = models.ManyToManyField(User, blank=True, null=True, related_name="Post_likes")
def __str__(self):
return self.text + ' | ' + str(self.user)
urls:
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
path("profile/<int:user_id>/<str:username>", views.profile, name="profile"),
path("following/<int:user_id>", views.following, name="following"),
path("login", views.login_view, name="login"),
path("logout", views.logout_view, name="logout"),
path("register", views.register, name="register"),
]
Relevant html:
<h1 id="username">{{ username }}</h1>
{% for profile in profiles %}
{% if profile.id == user_id %}
<h2>followers: {{ profile.followers.count }}</h2>
<h2>following: {{ profile.following.count }}</h2>
{% endif %}
{% endfor %}
{% if currentUser != username and currentUser.is_authenticated %}
<button class="btn btn-primary" id="follow">Follow</button>
{% endif %}
<div class="card text-center">
{% for post in posts %}
<div id="all-posts">
<div class="card-body">
<a><h5 class="card-title">{{ post.user }}</h5></a>
<p class="card-text">{{ post.text }}.</p>
<button class="btn btn-primary like">0</button>
{% if currentUser == post.user %}
<button class="btn btn-primary edit" id="edit">Edit</button>
{% endif %}
</div>
<div class="card-footer text-muted">
{{ post.timestamp }}
</div>
</div>
<hr>
{% endfor %}
{{ json_posts }}
</div>
<nav aria-label="Page navigation example">
<ul class="pagination">
{% if posts.has_previous %}
<li class="page-item"><a class="page-link" href="{% url 'profile' %}?page={{posts.previous_page_number}}">Previous</a></li>
{% endif %}
{% if posts.has_next %}
<li class="page-item"><a class="page-link" href="{% url 'profile' %}?page={{posts.next_page_number}}">Next</a></li>
{% endif %}
</ul>
</nav>