ng-options 值显示为 value="object:id" 而不是 value="id"

Posted

技术标签:

【中文标题】ng-options 值显示为 value="object:id" 而不是 value="id"【英文标题】:ng-options values shown as value="object:id" not value="id" 【发布时间】:2017-06-29 12:27:16 【问题描述】:

问题

总结:如何在使用 Angular http 服务从服务器检索数据时动态填充预渲染的 Django ChoiceField / ModelChoiceField。

我无法使用函数返回的数据填充 Django ModelChoiceField。我确实使用角度模板进行了此操作,但是问题是在保存到数据库之前我将无法使用 form.is_valid() 验证这些字段,因为目前我已将 <select> 字段硬编码到我的 html 中。

我有一个 ModelChoiceField 的原因是因为我尝试过滤 notification_type 的值并将它们附加到 notification_type 字段。即使表单字段已成功填充值,我也无法返回数据并在我的模板中显示,因为我有一个 Angular 控制器需要数据。

守则

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() 函数验证我的表单,但我还需要使用返回到我的 Angular 控制器的 JSON 数据对象填充第二个 ChoiceField。真正让我感到沮丧的是它与 Angular 配合得很好,只是我需要使用 form.notification_type 这会阻止我循环并显示从我的 Angular 控制器返回的 JSON 对象。

允许我验证 ChoiceField / ModelChoiceFields 的 html 模板

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>

我知道一种解决方法,这意味着我在所有表单 ChoiceFields 上设置 required=False。但是,我觉得这可能会导致进一步的问题。

任何建议或帮助将不胜感激。

【问题讨论】:

【参考方案1】:

解决方案(“ng-options”指令):

            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')) 

它最初在 value 字段中显示 object:id 的原因与我在 ng-option 属性中引用返回的 JSON 对象的方式有关。

【讨论】:

以上是关于ng-options 值显示为 value="object:id" 而不是 value="id"的主要内容,如果未能解决你的问题,请参考以下文章

使用 ng-options 更改 <option value> [重复]

angularjs用ng-options绑定select表单,怎么改变select表单中option的value值样式?

ng-options的使用

ng-options 将 ng-model 值设置为空白列表中的选定项

angularjs之ng-option

选择 ng-option 更改时获取值