python - 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)
现在代码显示此错误: 无法查询“用户”:必须是“模型”实例。
解决方案
登录的用户可以用 而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
。如果这些是Post
s,那么同一个用户可能是多个 Post
s 的作者。
注意:通常最好使用
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]将视图限制为经过身份验证的用户的视图 。
推荐阅读
- javascript - 如何启用跟踪组件道具的深度变化
- google-cloud-platform - Cloud Functions 在发送请求时是否使用相同的 IP
- javascript - 通过 Ajax 更新用户元数据
- python - JSON 到可更改的 txt,然后返回到 JSON
- google-sheets - 为什么 Google Sheet SUM 不适用于我的查询结果集
- security - 如何阻止 Google 访问受保护的内容
- powershell - 包管理器控制台的 PowerShell 版本错误
- php - 使用 Alamofire 在 user_id iOS 中保存数据
- python - 通过Python中的目录循环成对组合?
- netsuite - NetSuite Advanced PDF 总页码为 0