如何使用django自定义表单保存多个到多个字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用django自定义表单保存多个到多个字段相关的知识,希望对你有一定的参考价值。

如何将多个课程保存到学生表中。我想保留我的设计。这个代码不是通过AddStudentForm保存多个字段(课程)。它返回一个带有课程变量的错误。如果我使用CharField而不是ManyToManyField在课程模型中然后代码完美地工作,但是当我使用ManyToManyField然后它不起作用。当我使用form.errors时,它会抛出课程。如果我没有使用form.errors,那么它不会给出任何错误,也不会保存数据。

如何将多个课程保存到学生表中。我想保持我的设计。这个代码不是通过AddStudentForm保存多个字段(课程)。它返回一个带有课程变量的错误。

models.朋友

class Course(models.Model):
    title = models.CharField(max_length=250)
    price = models.IntegerField(default=0)
    duration = models.CharField(max_length=50)

    def __str__(self):
        return self.title
class Student(models.Model):
    name = models.CharField(max_length=100)
    courses = models.ManyToManyField(Course)
    email = models.EmailField()
    image = models.ImageField(upload_to='Students',blank=True)

    def __str__(self):
        return self.name

forms.朋友

class AddStudentForm(forms.ModelForm):
    # courses = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset=Course.objects.all())

    class Meta:
        model = Student
        fields = ['name','courses','email','image']

    def __init__(self, *args, **kwargs):
        super(AddStudentForm, self).__init__(*args, **kwargs)

        self.fields["courses"].widget = CheckboxSelectMultiple()
        self.fields["courses"].queryset = Course.objects.all()

views.朋友

def addstudent(request):
    courses = Course.objects.all()
    if request.method == 'POST':
        form = AddStudentForm(request.POST,request.FILES)
        if form.is_valid():
            student = form.save(commit=False)
            course = form.cleaned_data['courses']
            student.courses = course
            student.save()
            # student.courses.add(course)
            # student.save_m2m()
            # student.courses.set(course) # this method also didn't helped me

            messages.success(request, 'student with name  {}  added.'.format(student.name))
            return redirect('students:add_student')
        else:
            # messages.error(request,'Error in form.Try again')
            return HttpResponse(form.errors) # this block is called and returns courses
    else:
        form = AddStudentForm()
    return render(request,'students/add_student.html',{'form':form,'courses':courses})

add_student.html

                <form action="{% url 'students:add_student' %}" 
                  method="post" 
                 enctype="multipart/form-data">
                    {% csrf_token %}
                    <div class="form-group">
                        <h5>Full Name <span class="text-danger">*</span> 
                       </h5>
                        <div class="controls">
                            <input type="text" name="name" class="form- 
                control" > </div>
                    </div>
                    <div class="form-group">
                        <h5>Courses<span class="text-danger">*</span> 
                      </h5>
                    <div class="controls">
                     {% for course in courses %}
                     <input name ="courses" type="checkbox" id="course- 
                   {{course.id}}" value="{{course.title}}">
                     <label for="course-{{course.id}}">{{course.title}} 
                           </label>
                     {% endfor %} # i think the problem is here.
                   </div>
                    </div>
                            <div class="form-group">
                        <h5>Email <span class="text-danger">*</span></h5>
                        <div class="controls">
                            <input type="text" name="email" class="form- 
                      control" required> </div>
                    </div>

                    </div>
                    <div class="form-group">
                        <h5>Image <span class="text-danger">*</span></h5>
                        <div class="controls">
                        <input type="file" name="image" class="form-control" > </div>

                    </div>
                    <div class="text-xs-right">
                        <button type="submit" class="btn btn-info">Add</button>
                    </div>
                </form>
答案
You can set commit=True .
if form.is_valid():
       student = form.save(commit=True)
       student.save()
另一答案

在分配m2m之前需要先保存,系统需要学生模型的主键才能插入m2m表。

if form.is_valid():
            student = form.save(commit=False)
            course = form.cleaned_data['courses']            
            student.save()

            # this will save by it self
            student.courses.set(*course)

以上是关于如何使用django自定义表单保存多个到多个字段的主要内容,如果未能解决你的问题,请参考以下文章

使用注册表单添加到自定义用户字段(django)

Django:使用自定义保存方法更新表单中的对象

如何在 Django 字段中使用多个小部件?

如何在 django 中正确保存多个文件?

通过一个表单字段在 Django 中上传多个文件

Django - 自定义表单,特别是字段的外观