Django - 如何将表单中的默认值设置为当前用户?

Django - How Do I Set A Default Value In A Form To Be The Current User?

快速初学者 Django 问题,因为我一直无法找到直接解决我所追求的问题的答案,或者没有添加一堆我不需要的过于复杂的功能。

我有一个基本的博客设置,有一个用户模型和他们相关的 posts,以及一个用于创建新 posts 的表单。然而,我想要的只是让表单上的“作者”字段自动填充当前登录的用户,而不是所有注册用户的下拉列表。 我的模特:

class Post(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    body = models.TextField()
    post_date = models.DateField(auto_now_add=True)
    category = models.CharField(max_length=255)
    site = models.CharField(max_length=255)
    def __str__(self):
        return self.title + ' | ' + str(self.author)
    def get_absolute_url(self):
        return reverse('home')

我的表格:

class PostForm(forms.ModelForm):
 class Meta:
    model=Post
    fields = ('title', 'author', 'category', 'site', 'body')
    widgets = {
        'title': forms.TextInput(attrs={'class': 'form-control'}),
        'author': forms.Select(attrs={'class': 'form-control' ,'readonly': 'readonly'}),
        'category': forms.Select(choices=choice_list,attrs={'class': 'form-control'}),
        'site': forms.Select(choices=site_choice_list,attrs={'class': 'form-control'}),
        'body': forms.Textarea(attrs={'class': 'form-control'})
    }

我的看法:

class AddPostView(CreateView):
model = Post
form_class = PostForm
template_name = 'add_post.html'

重申一下,我只是希望 post 中的 'author' 字段是只读的,并填充当前登录的用户。而不是用户能够从用户列表中 select。

提前谢谢你,如果我能提供任何其他帮助你的帮助,请告诉我:)

您应该 禁用 该字段,而不仅仅是向小部件添加 readonly 属性,因为“黑客”可以伪造设置作者的恶意 HTTP 请求给另一个用户:

class PostForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['author']<strong>.disabled = True</strong>
    
    class Meta:
        model = Post
        fields = ('title', 'author', 'category', 'site', 'body')
        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-control'}),
            'author': forms.Select(attrs={'class': 'form-control'}),
            'category': forms.Select(choices=choice_list,attrs={'class': 'form-control'}),
            'site': forms.Select(choices=site_choice_list,attrs={'class': 'form-control'}),
            'body': forms.Textarea(attrs={'class': 'form-control'})
        }

然后我们可以在视图中使用此表单:

from django.contrib.auth.mixins import LoginRequiredMixin

class AddPostView(LoginRequiredMixin, CreateView):
    model = Post
    form_class = PostForm
    template_name = 'add_post.html'

    def <strong>get_initial</strong>(self):
        return <strong>{'author': self.request.user}</strong>

LoginRequiredMixin mixin [Django-doc] 保证只有登录的用户才能看到视图(并与之交互)。