#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)
- Обратите
if request.method == 'POST':
внимание, что это не требуется, так какpost()
метод будет выполняться только при выполнении запроса POST в текущем представлении. - Вы пытались инициализировать
response_data
вне метода, поэтому, как и в моем коде, вам нужно будет создать для этого другой метод, который я включил в свой пример кода.