Получить текущего зарегистрированного пользователя в форме django - PullRequest
0 голосов
/ 15 мая 2019

Я создаю блог-сайт, который каждый пользователь не может публиковать более чем в 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']

My Class Based View для создания блога

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 ]

1 голос
/ 15 мая 2019
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
0 голосов
/ 15 мая 2019

Вам необходимо передать объект запроса в вашу форму.если вы используете представления на основе методов, сделайте это следующим образом:

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

...