2017-09-20 5 views
1

Je sauve un brouillon de mon formulaire en utilisant AJAX (et un peu d'Angular).Pourquoi je reçois ' quand AJAX enregistre (et repeuple) ma forme dans Django

<!-- index.html --> 

... 
<input id="id_title" name="title" ng-model="title" placeholder="Question Title" type="text" value="" required /> 
... 

<script> 

    app.controller("addQuestionCtrl", function($http) { 

     $scope.title = '{% if form.title.value is not None %}{{ form.title.value }}{% endif %}'; 
     ... 

     $interval(function() { 
      ... 
      data = {title:''+$scope.title, ...}; 
      $http.post("{% url 'save_draft' %}", data).then(function(response) { 
       ... 
      }, function failureCallback(error) { 
       ... 
      }); 
     }, 10000); 

    }); 

</script> 

C'est tout fonctionne très bien et envoie un ' comme '. Dans mon view.py je convertir les données et le stocker dans la session:

def save_draft(request): 
    .... 
    posted = json.loads(request.body.decode("utf-8")) 
    ... 
    request.session['draft'] = { 
     'title': posted.get('title', None), 
     ... 
    } 

puis remplir les champs correspondants lorsque la page se charge

def question_add(request): 
    .... 
    if request.method == 'POST': 
     .... 
    else: 
     draft_question = request.session.get('draft', False) 
     if draft_question: 
      form = QuestionAddForm(initial={ 
       'title':draft_question['title'], 
       ... 
      }) 

Malheureusement, cela tourne cette

enter image description here

dans ce

enter image description here

ce n'est pas un problème d'encodage sur le côté client que le champ rend comme

<input id="id_title" name="title" ng-model="title" ... value="&#39;title in quotes&#39;" /> 

Je ne suis pas à pas pourquoi cela se produit :(

+0

Vous devez plutôt implémenter la méthode de rendu json dans la classe de formulaire et renvoyer des données qu'il est possible d'analyser avec js du côté du modèle. – mariodev

+0

N'importe quelle chance que vous pourriez développer sur cela!?! – Sevenearths

Répondre

1

Ce que vous devez faire à la place (ce est seulement le projet de code):

class QuestionAddForm(forms.ModelForm): 
    # ... 

    def draft_json(self, request): 
     # use attribute or pass request to form init method 
     draft_data = request.session.get('draft', False) 
     return json.dumps(draft_data) 


# in your view 
context['draft_json'] = form.draft_json(request) 


# in template 
<script> 
    var draft_data = JSON.parse('{{ draft_json|safe }}'); 
    $scope.title = draft_data.title 
</script> 

Le point ici est de rendre et d'analyser les données en utilisant le format JSON. Un bien meilleur moyen est d'utiliser ajax au lieu de transmettre des données de brouillon du backend pour éviter de mélanger le code js avec le contenu du template.

+0

Ceci est une bonne idée, car si les données devaient provenir d'un autre emplacement via une forme ajax, cela pourrait facilement mettre à jour le contenu de la page. Nice 1 – Sevenearths