首页 > 解决方案 > Django中的属性错误

问题描述

我正在尝试获取从视图中的另一个模型导入的作者对象并将其显示为表单,但是当我运行代码时,代码显示“WSGIRequest”对象没有属性“作者”错误。

这是views.py:

def post_views(request):
profile = Post.objects.get(author=request.author)
form = PostModelForm(request.POST or None, request.FILES or None, instance=profile)
confirm = False

if request.method == 'POST':
    if form.is_valid():
        form.save()
        confirm = True

context = {
    'profile':profile,
    'form': form,
    'confirm': confirm,
}

return render(request, 'posts/main.html', context)

这是模型.py

class Post(models.Model):
no_people = models.IntegerField()
no_days = models.IntegerField()
tour_date = models.CharField(max_length=200, blank=True)
Gender_types = (
    ('M', 'Male'),
    ('F', 'Female'),
    ('O', 'Others'),
)
Gender_prefer = models.CharField(max_length=1, choices=Gender_types)
location = models.CharField(max_length=200, blank=True)
pic_location = models.ImageField(blank=True, upload_to="posts/")
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)
detail = models.TextField() 
liked = models.ManyToManyField(Yatru, blank=True, related_name= 'likes')
author = models.ForeignKey(Yatru, on_delete=models.CASCADE, related_name = 'posts')

def __str__(self):
    return str(self.location)

def no_likes(self):
    return self.liked.all().count()

class Meta:
    ordering = ('-created',)

LIKE_CHOICES = (
('Like', 'Like'),
('Unlike', 'Unlike'),
 )

这是 main.html

{% block body %}
<form action="" method="POST" class="ui form" enctype='multipart/form-data'>
    {% csrf_token %}
    {{form.as_p}}
 </div>
 </div>

 <button type='submit'>
  Update
  
 </button>
 </form>
 {%endblock%}

这是 Yatru 模型

class Yatru(models.Model):
first_name = models.CharField(max_length=200, blank=True)
last_name = models.CharField(max_length=200, blank=True)
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField(default="Say Something about yourself!", max_length=300)
Gender_types = (
    ('M', 'Male'),
    ('F', 'Female'),
    ('O', 'Others'),
)
Gender = models.CharField(max_length=1, choices=Gender_types)
email = models.EmailField(max_length=200, blank=True)
country = models.CharField(max_length=200, blank=True)
avatar = models.ImageField(blank=False, upload_to="avatars/")
friends = models.ManyToManyField(User, blank=True, related_name="friends")
slug = models.SlugField(unique=True, blank=True)
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)

objects = models.Manager()

def get_friends(self):
    return self.friends.all()

def get_friends_no(self):
    return self.friends.all().count()

def get_posts_no(self):
    return self.friends.all().count()

def get_all_authors_posts(self):
    return self.posts.all().count()

def get_likes_given_no(self):
    likes = self.like_set.all()
    total_liked = 0
    for content in likes:
        if content.value == 'Like':
            total_liked += 1
    return total_liked

def get_likes_recieved_no(self):
    posts = self.like_set.all()
    total_liked = 0
    for content in posts:
            total_liked += content.likes.all().count()
    return total_liked




def __str__(self):
    return f"{self.user.username}-{self.created.strftime('%d-%m-%Y')}"

def save(self, *args, **kwargs):
    ex = False
    if self.first_name and self.last_name:
        to_slug = slugify(str(self.first_name) + " " + str(self.last_name))
        ex = Yatru.objects.filter(slug=to_slug).exists()
        while ex:
                to_slug = slugify(to_slug + " " + str(code_generator()))
                ex = Yatru.objects.filter(slug=to_slug).exists()
    else:
        to_slug = str(self.user)
    self.slug = to_slug
    super().save(*args, **kwargs)

我将代码更新为:

def post_views(request):
profile = get_object_or_404(Post, author=request.user)
form = PostModelForm(request.POST or None, request.FILES or None, instance=profile)
confirm = False

if request.method == 'POST':
    if form.is_valid():
        form.save()
        confirm = True

context = {
    'profile': profile,
    'form': form,
    'confirm': confirm,
}

return render(request, 'posts/main.html', context)

现在代码显示此错误: 无法查询“用户”:必须是“模型”实例。

标签: pythondjango

解决方案


登录的用户可以用 而request.user不是来检索request.author。因此,您可以通过以下方式获得对象:

from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404
from posts.models import Post

@login_required
def post_views(request):
    profile = get_object_or_404(Post, author=request.user)
    # …

Post您查询模型并将其存储在名为 的变量中也很奇怪profile。如果这些是Posts,那么同一个用户可能是多个 Posts 的作者。


注意:通常最好使用get_object_or_404(…)[Django-doc],然后直接使用.get(…)[Django-doc]。如果对象不存在,例如因为用户自己更改了 URL,get_object_or_404(…)则将导致返回HTTP 404 Not Found响应,而 using .get(…)将导致HTTP 500 Server Error


注意:您可以使用@login_required装饰器 [Django-doc]将视图限制为经过身份验证的用户的视图 。


推荐阅读