python - 在 Django 视图中返回多个返回语句时出错,“元组”对象没有属性“get”。| cs50 web项目4(网络)
问题描述
我在 CS50 Network 工作,应该设计一个类似于 Twitter 的社交网络网站,用于发帖和关注用户。在我的视图的返回语句中,我试图呈现一个页面和一个 jsonrespone。JsonResponse 是 JavaScript 可以访问它的原因。我得到的错误是:“元组”对象没有“get”属性。
视图(这显示了特定于用户的所有帖子的页面。当登录的用户单击帖子的用户名时,它会传递值。这就是视图中的参数获取其值的方式。):
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)
楷模:
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)
网址:
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"),
]
相关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>
解决方案
您收到此错误是因为您在视图more that one value
中的return
语句中返回。profile
Django 只需要一个。
def function():
return 1, 3
type(function()) # <class 'tuple'>
def function1():
return 1
type(function1()) # <class 'int'>
这就是你得到“元组”对象没有属性“get”的原因。
您可以通过只为每个返回一个值来简单地解决它view
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)
return render(request, "network/profile.html", {
"posts": pages,
"user_id": user_id,
"username": username,
"profiles": profiles,
"currentUser": request.user,
})
并为JsonResponse
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 JsonResponse(json_posts, safe=False)
推荐阅读
- java - @RequestMapping 没有 @ResponseBody 的不同行为
- reactjs - 如何将按钮折叠起来?
- kubernetes - 重复的大使映射是否会导致 Kubernetes 服务失效?
- r - 如何删除R中的匹配字符?
- php - PHP HTTP 500 试图从 api 发出 GET 请求
- mysql - 重新启动 docker 时表和记录丢失
- python-3.x - 在 ubuntu 中避免使用 /run/user 类型的路径
- java - 如何将 2 个独立列表转换为单个列表
- react-native - 在 TabBar 中的按钮中更改屏幕
- c# - 如何将异步 IO 任务的数量限制到数据库?