Собственный метод в CreateView

#python #json #django

#python #json #django

Вопрос:

Я хочу использовать свой собственный метод, который вернет JsonResponse, но этот метод не вызывается в этом представлении по умолчанию. Так что, может быть, мне нужно переписать другой метод или?

views.py:

 class CreatePostJS(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):
    fields = ('post_message', 'post_image')
    model = models.Post
    select_related = ('user',)
    template_name = 'posts/post_list.html'
    template_name = 'posts/post_form.html'
   
    response_data = {}
    response_data['text'] = model.post_message
    response_data['posted'] = model.posted_at
    response_data['user'] = model.user


    def create_post(request):
        if request.method == 'POST':
           
            return JsonResponse(serializers.serialize('json', response_data), safe = False)

    def form_valid(self, form):
        self.object = form.save(commit = False)
        self.object.user = self.request.user
        self.object.save()
        return super().form_valid(form)
  

Ответ №1:

https://docs.djangoproject.com/en/3.1/topics/class-based-views/intro/

В принципе, если вы хотите выполнить метод для запросов POST, вы можете переопределить метод post своим собственным. Это будет выглядеть примерно так:

 def post(self, request, *args, **kwargs):
    my_json_response = self.create_post(request)
    return super().post(request, *args, **kwargs)
  

Таким образом, нет необходимости проверять request.method в create_post, если вы не планируете использовать его в другом месте.

Комментарии:

1. Это не вернет JSONReponse . Вместо того, чтобы присоединять его к переменной, его необходимо вернуть.

2. О, я, должно быть, неправильно понял ваши намерения. Вы пробовали просто возвращать jsonresponse из метода post? Он должен работать так, как вы этого хотите.

Ответ №2:

Когда вы работаете с общими представлениями и хотите переопределить обработчик запроса по умолчанию, вам необходимо перезаписать обработчик метода по умолчанию для метода запроса. В вашем случае это post() метод из CreateView class .

Я настоятельно рекомендую способ ООП, чтобы он выглядел так:

 def get_request_data(self):
    return {
        'text': self.model.post_message,
        'posted': self.model.posted_at,
        'user': self.model.user
    }

def create_post(request):
    return JsonResponse(serializers.serialize('json', self.get_response_data()), safe = False)

def post(self, request, *args, **kwargs):
    return self.create_post(request)
  
  1. Обратите if request.method == 'POST': внимание, что это не требуется, так как post() метод будет выполняться только при выполнении запроса POST в текущем представлении.
  2. Вы пытались инициализировать response_data вне метода, поэтому, как и в моем коде, вам нужно будет создать для этого другой метод, который я включил в свой пример кода.