首页 > 解决方案 > 在 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>

标签: pythonhtmldjangowebcs50

解决方案


您收到此错误是因为您在视图more that one value中的return语句中返回。profileDjango 只需要一个。

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)

推荐阅读