以Django形式获取当前登录的用户

时间:2019-05-15 05:25:18

标签: python django django-forms django-templates

我正在创建一个博客网站,每个用户不能发布超过3个博客

所以我在form.py文件中写了它,以便它可以在提交前验证博客的数量

这是表格代码

class BlogForm(forms.ModelForm):
blog=forms.CharField(label='',
            widget=forms.Textarea(
                    attrs={'placeholder': "Your blog",
                        "class": "form-control",
                        }
                ))

def __init__(self, *args, **kwargs):
    self.user = kwargs.pop('user')
    super(BlogForm, self).__init__(*args, **kwargs)

def clean(self):
    cleaned_data=super(BlogForm, self).clean()
    user=cleaned_data.get(self.request.user)
    if Blog.objects.filter(user=user).count()>=3:
        raise forms.ValidationError("You have exceeded limit.")

class Meta:
    model=Blog
    fields = ['user',
              'blog',
             'tags']

我的基于类的视图,用于博客创建

class BlogCreateView(FormUserNeededMixin,CreateView):
form_class = BlogForm
template_name = 'blog/createview.html'
success_url = reverse_lazy('home')
form = BlogForm(user=request.user)

预期结果:同一登录用户的第四次博客提交,“您已超出限制”。此错误必须出现

实际:“ BlogForm”对象没有属性“ request”,此错误会出现

2 个答案:

答案 0 :(得分:1)

class BlogForm(forms.ModelForm):
blog=forms.CharField(label='',
            widget=forms.Textarea(
                    attrs={'placeholder': "Your blog",
                        "class": "form-control",
                        }
                ))

将此方法添加到您的表单类中

def __init__(self,user, *args, **kwargs):
        // do something with user

查看功能

form_class = BlogForm
def get_form_kwargs(self, *args, **kwargs):
    kwargs = super().get_form_kwargs(*args, **kwargs)
    kwargs['user'] = self.request.user
    return kwargs

答案 1 :(得分:0)

您需要将请求对象传递给表单。如果您使用的是基于方法的视图,请按照以下步骤操作:

def some_view(request):
    form = BlogForm(request.POST,request=request)

如果您使用的是基于类的视图,请重写get_form_kwargs()方法:

class SomeView(CreateView):

   def get_form_kwargs(self, *args, **kwargs):
     form_kwargs = super(SomeView).get_form_kwargs(*args, **kwargs)
     form_kwargs['request'] = self.request
     return form_kwargs

然后覆盖BlogForm以接受来自视图的请求:

class BlogForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        request = kwargs.pop('request', None)
        if request:
           self.request = request
        super(BlogForm, self).__init__(*args, **kwargs)

然后,您应该可以访问self.request

中的请求对象