как сохранить много-много полей с помощью пользовательских форм Django - PullRequest
0 голосов
/ 22 апреля 2019

как я могу сохранить многие курсы в таблице учеников. Я хочу сохранить свой дизайн таким образом. Этот код не сохраняет поле многие для многих (курсы) через AddStudentForm. Возвращает ошибку с переменной курсов. Если я использовал CharField вместо ManyToManyField в моделях для курсов, тогда код работает отлично, но когда я использую ManyToManyField, он не работает. выдает курсы, когда я использую form.errors. Если я не использовал form.errors, то не выдает ошибок и не сохраняет данные.

как я могу сохранить многие курсы в таблице учеников. Я хочу сохранить свой дизайн таким образом. Этот код не сохраняет поле многие для многих (курсы) через AddStudentForm. Возвращает ошибку с переменной курсов.

models.py

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.py

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.py

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>

1 Ответ

0 голосов
/ 22 апреля 2019

Прежде чем вы сможете назначить m2m, вам нужно сначала сохранить, системе требуется первичный ключ модели Student, прежде чем он сможет вставить ее в таблицу 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...