2017-02-17 100 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