Как сохранить много-много полей со значениями флажков в базе данных, используя django - PullRequest
0 голосов
/ 20 апреля 2019

С помощью этого кода я хочу сохранить несколько курсов в таблице учеников. Но этот код не работает. Ни он не выдает никакой ошибки, ни сохраняет какие-либо данные. Основная проблема заключается в том, что при нажатии кнопки «Отправить» кнопка «Отправить» не выполняет никаких действий. на всех. Это не загружает кнопку отправки. Как я могу решить это? Я думаю, что проблема в шаблоне add_student.html. Когда я возвращаю form.error, он выбрасывает курс. Есть ли что-то, что я должен изменить ??, но я хочу сохранить свой дизайн таким образом

models.py

class Course(models.Model):
    title = models.CharField(max_length=250)
    basic_price = models.CharField(max_length=100)
    advanced_price = models.CharField(max_length=100)
    basic_duration = models.CharField(max_length=50)
    advanced_duration = models.CharField(max_length=50)

    def __str__(self):
        return self.title


class Student(models.Model):
    name = models.CharField(max_length=100)
    course = models.ManyToManyField(Course)
    address = models.CharField(max_length=200)
    email = models.EmailField()
    phone = models.CharField(max_length=15)
    image = models.ImageField(upload_to='Students',blank=True)
    joined_date = models.DateField()

    def __str__(self):
        return self.name

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()
            student.save()
            # student.course.set(courses)
            messages.success(request, 'student saved.')
            return redirect('students:add_student')
        else:
            return HttpResponse(form.errors) # it returns course.i think the problem is while saving the course

    else:
        form = AddStudentForm()
    return render(request,'students/add_student.html',{'form':form,'courses':courses})

forms.py

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

    class Meta:
        model = Student
        fields = ['name','course','email','address','phone','image','joined_date']

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" required data-validation-required-message="This field is required"> </div>
                        </div>
                     <div class="form-group">
                       <h5>Courses <span class="text-danger">*</span></h5>
                       <div class="controls">
                         {% for course in courses %}
                         <input name ="course" type="checkbox" id="{{course.title}}" required value="{{course.id}}">
                         <label for="{{course.title}}">{{course.title}}</label>
                         {% endfor %}
                       </div>
                     </div>
                        <div class="form-group">
                            <h5>Address<span class="text-danger">*</span></h5>
                            <div class="controls">
                                <input type="text" name="address" class="form-control" required data-validation-required-message="This field is required"> </div>
                        </div>
                        <div class="form-group">
                            <h5>Phone Number <span class="text-danger">*</span></h5>
                            <div class="controls">
                                <input type="text" name="phone" data-validation-required-message="This field is required" class="form-control" required> </div>
                        </div>
                        <div class="form-group">
                            <h5>Email <span class="text-danger">*</span></h5>
                            <div class="controls">
                                <input type="email" name="email"  data-validation-required-message="This field is required" class="form-control" required> </div>
                        </div>
                          <div class="form-group">
                            <h5>Joined Date <span class="text-danger">*</span></h5>
                            <div class="controls">
                                <input type="date" name="joined_date" data-validation-required-message="This field is required" class="form-control" required> </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">Submit</button>
                        </div>
                    </form>

Ответы [ 2 ]

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

Попробуйте представление на основе классов

class CreateStudent(CreateView):
    model = Student
    form_class = AddStudentForm
    template_name = "add_student.html"
0 голосов
/ 20 апреля 2019

Я бы порекомендовал это решение:

courses = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset= Course.objects.all())

в views.py

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

пс. Рекомендуется называть поля m2m во множественном числе: courses = models.ManyToManyField(Course)

вот что я имел в виду с шаблонами: в add_student.html

  1. Закомментируйте весь блок <form> и замените его на {{ form }} Джанго и посмотрите, как он будет отображаться
  2. У вас есть набор запросов курсов, переданных в контексте шаблона. Попробуйте изменить его с:

                    {% for course in courses %}
                     <input name ="course" type="checkbox" id="{{course.title}}" required value="{{course.title}}">
                     <label for="{{course.title}}">{{course.title}}</label>
                     {% endfor %}
    

просто:

{{ form.cource }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...