Как заполнить / заполнить ChoiceField пользовательскими значениями в формах Django - PullRequest
0 голосов
/ 22 октября 2018

Я пытался создать форму для удаления элемента, но я не знаю, как связать поле с моделью, вот что я делаю:

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 голосов
/ 22 октября 2018

1) Подход с использованием queryset

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'])
0 голосов
/ 22 октября 2018

Вы можете передать все имена в одно поле с помощью:

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

...