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] 保证只有登录的用户才能看到视图(并与之交互)。
快速初学者 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] 保证只有登录的用户才能看到视图(并与之交互)。