我一直在尝试制作一个用于删除项目的表单,但是我不知道如何将字段连接到模型,这是我正在做的事情:
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,如您所见,它会自动设置表单的值,因为这些值已经“绑定”到模型字段中,而不是我添加的选择字段。我该如何纠正?
答案 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'])