Обобщенная: Как заполнить предварительно оказанные 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)
Как это отображается
Вот сайт функционирует с моим текущим кодом.
руку помощи мне нужно
Я хотел бы использовать 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. Тем не менее, я считаю, что это может привести к дальнейшим проблемам.
Любые советы или помощь будут высоко оценены.