如何将登录的用户ID传递给CreateView

时间:2020-08-23 18:55:30

标签: django django-models django-views

我不知道如何自动将当前用户的姓名作为帖子的作者。

如果添加作者fields = ['headline', 'quote', 'author'],则会显示并传递下拉菜单,但我需要登录用户的名称为默认名称。

我的观点:

class PostCreate(CreateView):
model = Post
user = User
fields = ['headline', 'quote']
success_url = '/index'
template_name = 'base_homepage.html'

@login_required()
def get_context_data(self, **kwargs):
    kwargs['latest_posts_list'] = Post.objects.order_by('-id')
    return super(PostCreate, self).get_context_data(**kwargs)

我的模特:

class Post(models.Model):
_id = models.ObjectIdField
headline = models.TextField(max_length=255)
quote = models.TextField(max_length=140)

creation_time = models.DateTimeField(editable=False).auto_now_add

author = models.ForeignKey(
    get_user_model(),
    on_delete=models.CASCADE,
)

def __str__(self):
    return self.headline[:25]

1 个答案:

答案 0 :(得分:2)

您可以使用form_valid方法修补对象:

from django.contrib.auth.mixins import LoginRequiredMixin

class PostCreate(LoginRequiredMixin, CreateView):
    model = Post
    fields = ['headline', 'quote']
    success_url = '/index'
    template_name = 'base_homepage.html'
    
    def get_context_data(self, **kwargs):
        kwargs['latest_posts_list'] = Post.objects.order_by('-id')
        return super(PostCreate, self).get_context_data(**kwargs)

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

注意:您可以将视图限制为基于类的视图,以使用 LoginRequiredMixin mixin [Django-doc]


注意documentation建议 使用AUTH_USER_MODEL setting [Django-doc] get_user_model() [Django-doc]。 这样比较安全,因为如果尚未加载身份验证应用,则设置 仍可以指定模型名称。因此最好写:

from django.conf import settings

class Post(models.Model):
    # …
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )
相关问题