Py学习  »  Django

如何获取当前登录用户?Django模型

Manas S. Roy • 4 年前 • 2111 次点击  

我想让当前登录的用户访问这个CreateForm表单。下面是我的当前代码,这里是我的请求。用户没有给我错误

ValueError位于/创建帖子/ 无法分配“<SimpleLazyObject:<用户:testuser>”:“Post.author”必须是“author”实例。

模型。py

class Author(models.Model):
   user = models.OneToOneField(User, on_delete=models.CASCADE)
   rate = models.IntegerField(default=0)
 
class Post(models.Model):
    title = models.CharField(max_length= 50)
    overview = models.TextField()
    body_text = RichTextUploadingField(null = True)
    time_upload = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(Author, related_name='author', on_delete=models.CASCADE)
    thumbnail = models.ImageField(upload_to = 'thumbnails')
    publish = models.BooleanField()
    categories = models.ManyToManyField(Categories)
    read = models.IntegerField(default=0)
    slug = models.SlugField(null= True, blank= True)

形式。py

class CreateForm(ModelForm):
class Meta:
    model = Post
    fields = [
        'title',
        'overview',
        'body_text',
        'thumbnail',
        'categories',
        'publish',
    ]

意见。py

def create_post(request):
if request.method == 'POST':
    form = CreateForm(request.POST, request.FILES)
    if form.is_valid:
        post = form.save(commit=False)
        post.author= request.user
        post.save()
        return render(request, 'index.html')
else:
    form = CreateForm()
return render(request, 'create_post.html', {'form': form})
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/131096
文章 [ 2 ]  |  最新文章 4 年前
Kauê Oliveira
Reply   •   1 楼
Kauê Oliveira    4 年前

这个 author 你的场地 Post 模型是 Author 模型,而不是用户。你可以替换 post.author = request.user 与:

if request.user.author:
    post.author = request.user.author
else:
    post.author = Author.objects.create(user=request.user)

如果已经为用户创建了Author实例,Willem给出的答案是有效的,但如果没有与该用户关联的Author对象,则会抛出异常。

Willem Van Onsem
Reply   •   2 楼
Willem Van Onsem    4 年前

正如错误所说, post.author 期待 Author 对象,而不是用户。因此,您可以通过以下方式检索:

from django.contrib.auth.decorators import login_required

@login_required
def create_post(request):
    if request.method == 'POST':
        form = CreateForm(request.POST, request.FILES)
        if form.is_valid():
            form.instance.author= request.user.author
            form.save()
            return render(request, 'index.html')
    else:
        form = CreateForm()
    return render(request, 'create_post.html', {'form': form})

你也应该 呼叫 这个 is_valid() method [Django-doc] 所以 form.is_valid () .


笔记 :您可以将视图限制为具有 @login_required decorator [Django-doc] .


笔记 :通常最好利用 settings.AUTH_USER_MODEL  [Django-doc] 参考用户模型,而不是使用 User model [Django-doc] 直接地有关更多信息,请参见 referencing the User model section of the documentation .