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

Vol*_*pym 3 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)
Run Code Online (Sandbox Code Playgroud)

我的模型:

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]
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 6

您可以在方法中修补对象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)
Run Code Online (Sandbox Code Playgroud)

注意:您可以使用LoginRequiredMixinmixin [Django-doc]将视图限制为基于类的视图,以供经过身份验证的用户使用 。


注意文档建议使用AUTH_USER_MODEL设置 [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
    )
Run Code Online (Sandbox Code Playgroud)