【问题标题】:Own method in CreateViewCreateView 中的自己的方法
【发布时间】:2020-10-30 15:21:36
【问题描述】:

我想使用我自己的方法,它会返回 JsonResponse,但是这个 View 默认不调用这个方法。所以也许我需要重写另一种方法?

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)

【问题讨论】:

    标签: python json django


    【解决方案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)
    

    这样就不需要在 create_post 中检查 request.method 了,除非你打算在别处使用它。

    【讨论】:

    • 这不会返回 JSONReponse。与其将其附加到变量上,不如将其返回。
    • 哦,我一定误解了你的意图。您是否尝试过从 post 方法返回 jsonresponse ?它应该按照你想要的方式工作。
    【解决方案2】:

    当您使用通用视图并想要覆盖默认请求处理程序时,您需要覆盖请求方法的默认方法处理程序。在您的情况下,它是来自 CreateView 类的 post() 方法。

    我强烈推荐 OOP 方式,所以它看起来像:

    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,因此在我的代码中您需要为此创建另一个方法 - 我在示例代码中包含了该方法。

    【讨论】:

      猜你喜欢
      • 2013-02-20
      • 2011-07-07
      • 2011-02-06
      • 2023-03-28
      • 1970-01-01
      • 2022-12-14
      • 2013-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多