2017-02-11 6 views
0

Проблеманг-варианты значения отображаются как значения = «объекта: идентификатор» не значение = «идентификатор»

Обобщенная: Как заполнить предварительно оказанные Django ChoiceField/ModelChoiceField динамически при использовании Угловое http-сервис для извлечения данных с сервера.

Я не могу заполнить Django ModelChoiceField с возвращенными данными от функции. У меня было это с угловым шаблоном, однако проблема в том, что я не смогу проверить эти поля с помощью form.is_valid() перед сохранением в базе данных, поскольку в настоящее время я жестко закодировал поля <select> в свой html.

Причина, по которой у меня есть ModelChoiceField, заключается в том, что я попытался фильтровать значения notification_type и добавить их в поле notification_type. Несмотря на то, что поле формы успешно заполнено значениями, мне не удалось вернуть данные и отобразить в моих шаблонах, поскольку у меня есть угловой контроллер, ожидающий данных.

Кодекс

HTML

<div> 
    <label>Select department</label> 
    <div> 
     {{ form.department }} 
    </div> 
</div> 
<div> 
    <label>Select notification type</label> 
    <div ng-controller="selectNotificationTypeCtlr"> 
     <select ng-change="getNotfications()" ng-model="selectedNotificationType"> 
       <option ng-repeat="i in notificationTypes" value="{[{ i.pk }]}">{[{ i.fields.notification_type }]}</option> <!-- fields.notification_type --> 
     </select> 
    </div> 
</div> 

app.js

selectNotification.controller('selectDepartmentCtlr', function($scope, $http) { 
$scope.getNotificationType = function() { 
    var id = $scope.selectedDepartment; 
    var notificationTypes = []; 
    $http({ 
     method : "GET", 
     url : id 
    }).then(function success(response) { 
     $scope.notificationTypes = response.data; 
    }, function error(response) { 
     var errorMessage = "Oops it looks like something went wrong. Please try again."; 
    }); 
    }; 
}); 

Как вы можете видеть, что я понимаю процесс, его просто интегрировать его с Django форм ,

views.py

@login_required(login_url="/login/") 
def get_notification_types(request, id): 
if request.method == "GET": 
    department = Department.objects.get(id=id) 
    notification_types = NotificationType.objects.filter(department=department.id) 
    return HttpResponse(serializers.serialize('json', notification_types)) 

forms.py

from django import forms 
from notifications.models import Department 
from notifications.models import NotificationType 


class SelectNotificationForm(forms.Form): 
    department = forms.ModelChoiceField(queryset=Department.objects.all(), widget=forms.Select(attrs={'class':'input-element', 'ng-change':'getNotificationType()', 'ng-model':'selectedDepartment'})) #widget=forms.Select(attrs={'class': 'add_class_here'}) # ChoiceField(widget=forms.Select() 
    notification_type = forms.ModelChoiceField(queryset=NotificationType.objects.none(), widget=forms.Select(attrs={'class':'input-element'})) 
    notification_name = forms.ChoiceField(widget=forms.Select(attrs={'class':'input-element'})) 
    notification_contacts = forms.MultipleChoiceField(widget=forms.SelectMultiple(attrs={'class':'input-element'})) 
    subject = forms.CharField(widget=forms.Select(attrs={'class':'input-element'})) 
    body = forms.CharField(widget=forms.Textarea) 

Как это отображается

Вот сайт функционирует с моим текущим кодом.

Screenshot of site

руку помощи мне нужно

Я хотел бы использовать Django, чтобы проверить свою форму с помощью функции is_valid(), когда она будет сохранена, но мне также нужно заполнить второй ChoiceField с объектом данных JSON, возвращаемым на мой Угловой контроллер. Вещь, которая меня действительно поражает, заключается в том, что она отлично работает с Angular, а именно тем фактом, что мне нужно использовать {{form.notification_type}}, которая мешает мне перебирать и отображать возвращенный объект JSON из моего углового контроллера.

HTML шаблон, который позволит мне проверить ChoiceField/ModelChoiceFields

HTML (В идеале я хотел бы, чтобы сделать форму, как в коде ниже, так что я могу проверить форму.)

<div> 
    <label>Select department</label> 
    <div> 
     {{ form.department }} 
    </div> 
</div> 
<div> 
    <label>Select notification type</label> 
    <div ng-controller="selectNotificationTypeCtlr"> 
     {{ form.notification_type }} 
    </div> 
</div> 

Я знаю, обходной путь, который впоследствии будет означать меня настройка требуется = False на всех форм ChoiceFields. Тем не менее, я считаю, что это может привести к дальнейшим проблемам.

Любые советы или помощь будут высоко оценены.

ответ

0

Solution («нг-варианта» директива):

  notification_type = forms.ModelChoiceField(queryset=NotificationType.objects.none(), widget=forms.Select(attrs={'class':'input-element', 'ng-focus':'populateNotificationTypes()', 'ng-change':'x()', 'ng-model':'selectedNotificationType', 'ng-options':'x.pk as x.fields.notification_type for x in notificationTypes', 'ng-model':'selectedNotificationType'})) 

Причина, почему он первоначально отображение объекта: идентификатор в поле значения была связана с тем, как я ссылкой на возвращенный объекте JSON в моих нг -option.

 Смежные вопросы

  • Нет связанных вопросов^_^