如何在Django表单中使用自定义值填充/填充ChoiceField

时间:2018-10-21 21:33:55

标签: python django django-models django-forms

我一直在尝试制作一个用于删除项目的表单,但是我不知道如何将字段连接到模型,这是我正在做的事情:

class StudentForm(forms.ModelForm):
    queryset = Student.objects.filter().values('name')
    choices = [('', var) for var in queryset]
    names = forms.ChoiceField(choices=choices)

    class Meta:
        model = Student
        fields = '__all__'

我使用该类连接到Student模型并使用其字段,但是我想向其添加一个自己的字段names = forms.ChoiceField(choices=choices),但是我想知道的是,我将如何例如,将列出所有名称的该字段连接到表单上,以便我可以选择对象的名称,然后可以相应地更改/删除它?

class StudentRegister(generic.FormView):
    template_name = 'students/student_form.html'
    form_class = StudentForm
    success_url = '/'

    def form_valid(self, form):
        form.save(commit=True)
        return super().form_valid(form)

这是我的views.py,如您所见,它会自动设置表单的值,因为这些值已经“绑定”到模型字段中,而不是我添加的选择字段。我该如何纠正?

2 个答案:

答案 0 :(得分:0)

您可以使用以下方法将所有名称传递给单个字段:

class StudentForm(forms.ModelForm):
    name = forms.ModelMultipleChoiceField(queryset=Student.objects.all())

    class Meta:
        model = Student
        fields = '__all__'

,然后让您的Student模型返回名称:

class Student(models.Model):

    # Model fields

    def __str__(self):
        return self.name

您可以在https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/#overriding-the-default-fields

寻找更多与表单交互的方式。

答案 1 :(得分:0)

1)使用查询集的方法

class StudentForm(forms.ModelForm):
    name = forms.ChoiceField(queryset=Student.objects.all())

    or

    name = forms.ChoiceField([("%s" % stud['id'], "%s" % stud['name']) for stud in
                       Student.objects.all().values('id', 'name')])


class Student(models.Model):

    # existing fields comes here

    def __str__(self):
        return self.name

2)使用ajax动态加载

class StudentForm(forms.ModelForm):
    name = forms.ChoiceField()


class Student(models.Model):

    # existing fields comes here

    def __str__(self):
        return self.name

使用Ajax加载数据

<script>
(function($){

//get your data
function get_data(){
    $("#<id_of_choice_field>").empty();
        $.ajax ({
            type: "POST",
            url: "<url_for_getting_data>",
            data: { "csrfmiddlewaretoken": "{{ csrf_token }}" },
            cache: false,
            success: function(json) {
                if (json) {
                    for (var source in json) {
                       $("#id_of_choice_field").prepend("<option value='"+json[source].id+"'>"+json[source].name+"</option>");
                    }

                }
            }
        });
    $("#id_of_choice_field").prepend("<option value='' selected='selected'>--------------</option>");
}
get_data();

}(django.jQuery));
</script>

AJAX URL和方法

url(r'^get-all-student/$', get_all_student)

def get_all_student(request):
    """

    :param request:
    :return:
    """
    if request.method == "POST" and request.is_ajax():
        all_student = []
        for student in Student.objects.all().values('id', 'name'):
            all_student.append({'id': student['id'], 'name': student['name']})
        return HttpResponse(json.dumps(all_student), content_type="application/json")
    return HttpResponseNotAllowed(['GET'])
相关问题