2017-02-17 77 views
12

对不起,如果这看起来像一个愚蠢的问题,但我花了很多时间在这个,无法找出一个理想的方式来做到这一点。Django表格与ReactJS

我有使用Django模板呈现的Django表单。现在,我想将一个React组件添加到其中一个表单字段(也可能是长期的多个字段)。

根据我目前阅读的内容,似乎最好不要将Django模板与React渲染混合在一起,并让Django仅作为将JSON数据发送到React的后端API,而React将接管整个表单渲染。所以我现在试图通过React完全重新渲染我的表格。现在我已经创建了serializers.py来定义将数据发送到React并在我的环境中设置Django Rest Framework,而不是forms.py。现在我正试图弄清楚如何发送这些数据。有一些很好的在线教程(和SO帖子)讨论了如何将Django/DRF与React集成,但没有找到通过React和DRF进行端到端表单呈现的单个示例。具体而言,任何人都可以让我知道我真的在我的视图中写了什么,然后可以用于从React尝试获取表单数据的GET请求? Web引用或仅仅需要的广泛步骤应该足以让我开始使用(并且深入挖掘文档)。

更新: 还增加了这里的serializers.py代码的简化版本:

from .models import Entity 
from rest_framework import serializers 


class EntitySerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Entity 
     fields = ['name', 'role', 'location'] 
+1

1给予好评和1下来。很高兴能得到评论支持的downvotes请。我一直在寻找一个很好的解决方案(以及正确的做事方式),但令人惊讶的是甚至找不到通过React呈现的Django表单的一个例子。 DRF有一个很好的文档,但是(如果我理解正确的话),我没有看到表单数据正在被发送的一个很好的例子(即,用户获得一个空白表单,填充它,提交回来 - 所有的Django只作为一个后台在前端的API和React渲染)我猜应该是一个非常常见的用例 – Anupam

回答

6

首先,我认为你需要检查related React documentation大约有多个输入形式。它为您提供了有关如何在React方面构建事物的基本想法。

关于从服务器获取数据,你可以尝试这样的事情在componentDidMount

componentDidMount() { 
    // Assuming you are using jQuery, 
    // if not, try fetch(). 
    // Note that 2 is hardcoded, get your user id from 
    // URL or session or somewhere else. 
    $.get('/api/profile/2/', (data) => { 
     this.setState({ 
      formFields: data.fields // fields is an array 
     }); 
    }); 
} 

然后你就可以像这样的东西创建render方法您的HTML输入元素:

render() { 
    let fields = this.state.formFields.map((field) => { 
     return (
      <input type="text" value={field.value} onChange={(newValue) => {/* update your state here with new value */ }} name={field.name}/> 
     ) 
    }); 
    return (
     <div className="container"> 
      <form action=""> 
       {fields} 
       <button onClick={this.submitForm.bind(this)}>Save</button> 
      </form> 
     </div> 
    ) 
} 

而且这里是你的submitForm方法:

submitForm() { 
    $.post('/api/profile/2/', {/* put your updated fields' data here */}, (response) => { 
     // check if things done successfully. 
    }); 
} 

更新:

这里是您的DRF视图中untested-but-should-work例如:

from rest_framework.decorators import api_view 
from django.http import JsonResponse 
from rest_framework.views import APIView 


class ProfileFormView(APIView): 
    # Assume you have a model named UserProfile 
    # And a serializer for that model named UserSerializer 
    # This is the view to let users update their profile info. 
    # Like E-Mail, Birth Date etc. 

    def get_object(self, pk): 
     try: 
      return UserProfile.objects.get(pk=pk) 
     except: 
      return None 

    # this method will be called when your request is GET 
    # we will use this to fetch field names and values while creating our form on React side 
    def get(self, request, pk, format=None): 
     user = self.get_object(pk) 
     if not user: 
      return JsonResponse({'status': 0, 'message': 'User with this id not found'}) 

     # You have a serializer that you specified which fields should be available in fo 
     serializer = UserSerializer(user) 
     # And here we send it those fields to our react component as json 
     # Check this json data on React side, parse it, render it as form. 
     return JsonResponse(serializer.data, safe=False) 

    # this method will be used when user try to update or save their profile 
    # for POST requests. 
    def post(self, request, pk, format=None): 
     try: 
      user = self.get_object(pk) 
     except: 
      return JsonResponse({'status': 0, 'message': 'User with this id not found'}) 

     e_mail = request.data.get("email", None) 
     birth_date = request.data.get('birth_date', None) 
     job = request.data.get('job', None) 

     user.email = e_mail 
     user.birth_date = birth_date 
     user.job = job 

     try: 
      user.save() 
      return JsonResponse({'status': 1, 'message': 'Your profile updated successfully!'}) 
     except: 
      return JsonResponse({'status': 0, 'message': 'There was something wrong while updating your profile.'}) 

,这是对这一观点的相关网址:

urlpatterns = [ 
    url(r'^api/profile/(?P<pk>[0-9]+)/$', ProfileFormView.as_view()), 
] 
+0

感谢您的回应!要开始,我特别想找到如何构建我的Django视图。我一直在尝试遵循[DRF教程]中给出的示例(http://www.django-rest-framework.org/tutorial/1-serialization/#writing-regular-django-views-using-our- serializer ),但它讨论了创建和更新现有的模型实例等。我想在视图中编写一个API端点,以允许将表单域发送到另一端,以便为用户填充空白表单。这似乎是一个非常基本的用例,但我目前无法找到任何示例。 – Anupam

+0

由于您正在使用'react'来创建html部分,您为什么还需要'django forms'呢?您可以在反应中创建空白表单。为了获得值(比如'ModelForm'),你可以使用api views + ajax请求。 – alix

+0

对不起,您的意思是不发送表单字段到React来渲染表单并在React方面自己定义字段? (因为这将有点非DRYISH,因为我将在两个不同的地方维护表单字段?)我没有使用Django表单,但需要一种方法将表单字段发送到React,以便React知道要呈现哪些字段(如果它有帮助,也用简化版本的serializers.py更新了这个问题)。谢谢你试图帮助我。 – Anupam