【问题标题】:Django - How Do I Set A Default Value In A Form To Be The Current User?Django - 如何在表单中设置默认值以成为当前用户?
【发布时间】:2022-01-02 21:26:49
【问题描述】:

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

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

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'

重申一下,我只是希望帖子中的“作者”字段是只读的,并填充当前登录的用户。而不是用户能够从用户列表中进行选择。

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

【问题讨论】:

  • 如果它是只读的,我真的不明白为什么它应该成为表单的一部分。
  • 您能分享一下您使用此表单的视图吗?
  • @WillemVanOnsem 视图是:class AddPostView(CreateView): model = Post form_class = PostForm template_name = 'add_post.html' 我只想用当前用户自动填充作者字段。这就是我在这里所追求的,我理解你的立场,但我只是想了解如何自动填充字段,而不是讨论表单偏好。
  • 可以请edit有观点的问题吗?
  • 不要创建评论,而是edit问题。

标签: python django django-models django-forms blogs


【解决方案1】:

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

class PostForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['author'].disabled = True
    
    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 get_initial(self):
        return {'author': self.request.user}

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

【讨论】:

  • 我认为您可能在 get_initial 覆盖中指的是 self.request.user
  • @AdT:是的,这是一个错误。谢谢,更新了!
猜你喜欢
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 2011-11-03
相关资源
最近更新 更多