【问题标题】:How to return a html page when user send a post request in Django Rest framework用户在 Django Rest 框架中发送发布请求时如何返回 html 页面
【发布时间】:2019-06-23 07:36:04
【问题描述】:

我想返回一个 HTML 页面,其中包含用户在 django restframework 中发布的值

我创建的模型是

class DetailView(viewsets.ModelViewSet):
    queryset= Detail.objects.all()
    serializer_class = DetailSerializer

@action(methods=['GET'],detail=False)  
def get(self,request):
    first_name= request.POST.get("first_name")
    last_name = request.POST.get("last_name")
    return redirect ('index.html/')

网址: 路由器 = routers.DefaultRouter() router.register('detail',views.DetailView)

索引.html: {{first_name}}
{{姓氏}}

我想自动返回一个带有他们发布的值的 html 页面

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    我认为必须在 post 方法中定义,而不是在 get 方法中。我假设您要发布表单给出的数据。在我看来,这将是一种适用的方式:

    views.py

    class DetailView(viewsets.ModelViewSet):
        form_class = PersonalDataForm # defined in forms.py
        view_template = 'index.html'
    
    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
            personal_data = {}
            first_name = form.cleaned_data['first_name']
            personal_data['first_name'] = first_name
            last_name = form.cleaned_data['last_name']
            personal_data['last_name'] = last_name            
    
            return render(request, self.view_template, {'form': form, 'personal_data': personal_data}
    

    index.html

    <form action="" method="POST">
        {% csrf_token %}
        {{ form.first_name }}
        {{ form.last_name }}
        <button type="submit" id="submit-button">save</button>
    </form>
    
    {{ personal_data.first_name }}
    {{ personal_data.last_name }}
    

    如果用户发送 GET 请求,您可能希望隐藏表单。您可以通过将 wohle 表单包装到 if 子句中来做到这一点,例如 {% if valid_data_submitted %} ... {% endif %}

    forms.py

    class PersonalDataForm(forms.ModelForm):
        first_name = forms.CharField()
        last_name = forms.CharField()
    
        def save(self, commit=True):
            self.instance.first_name = first_name
            self.instance.last_name = last_name
            return super(PersonalDataForm, self).save(commit)
    
        class Meta:
            model: models.Detail
    

    这可能是第一种方法。为了进一步解释,我需要知道用户将如何发布数据。

    【讨论】:

    • 您好,感谢您的回复,我是 django 新手,实际上我正在构建一个 API,我将从另一台服务器接收数据,我想将该数据传递到我的 html 页面,然后我返回一个带有他们名字的 html 页面。
    【解决方案2】:

    我认为您应该将视图中的renderer_classes 属性更改为TemplateHTMLRenderer

    document link

    但如果我是你,我更喜欢使用 django 类基础视图。 我在我之前的项目中使用了它以及 django rest-framework,它非常完美。 django class-base view

    【讨论】:

    • 您好我有一个疑问,它会直接传递帖子值并返回一个html页面吗?对不起,我是 django 的新手。
    • 但如果我是你,我更喜欢使用 django 类基础视图。我在我之前的项目中使用了它以及 django rest-framework,它非常完美。 docs.djangoproject.com/en/2.2/topics/class-based-views
    • @shiva24 是的,它会这样做,除此之外,您可以从 django 视图集创建一个视图集以公开 html ,我认为这更好。
    猜你喜欢
    • 2015-06-18
    • 2018-10-30
    • 2020-07-18
    • 2018-07-31
    • 2023-03-13
    • 2013-05-21
    • 2020-05-03
    • 2014-02-04
    • 2019-07-05
    相关资源
    最近更新 更多