【问题标题】:I need advice on how to implement a checkbox in Django我需要关于如何在 Django 中实现复选框的建议
【发布时间】:2018-08-06 18:31:24
【问题描述】:

我正在尝试创建一种学生可以注册老师课程的方式。我在我的 StudentData 模型中添加了一个布尔字段,然后我在我的课程模型中添加了一个多对多字段。我的每个课程页面都是一个生成的 slug 页面,所有学生都被列出。我希望在每个学生附近都会显示一个复选框。如果教师选择更多学生并按下 Enroll 按钮,则只有这些学生可以查看课程。

现在,模板条件我可以自己完成,但我坚持使用复选框以正确的方式更新数据。这是样板:

<ul>
    {% for student in students %}
        <br>
        <br>
        {{ student.name }} {{ student.surname }}<input type='checkbox' {% ifequal value 0 %}checked{% endifequal %}> 0
        <br>
        <br>
    {% endfor %}
</ul>
<div class="row">
    <div class="col-md-4">
        <div class="pagination">
            <span class="step-links">
                {% if students.has_previous %}
                    <a href="?page=1">&laquo; first</a>
                    <a href="?page={{ students.previous_page_number }}">previous</a>
                {% endif %}
                <span class="current">
                    {{ students.number }}
                </span>
                {% if students.has_next %}
                        <a href="?page={{ students.next_page_number }}">next</a>
                        <a href="?page={{ students.paginator.num_pages }}">last &raquo;</a>
                {% endif %}
            </span>
        </div>
    </div>
    <div class="col-md-4">
        <button class="btn-success">Enroll</button>    
    </div>
</div>


class StudentDataForm(forms.ModelForm):
    enrolled = forms.BooleanField()

    def __init__(self):
        if self.checked:
            self.fields['enrolled'].initial = True

    class Meta:
        model = StudentData
        fields = ('enrolled', )


class StudentData(models.Model):
    name = models.CharField(max_length=30)
    surname = models.CharField(max_length=50)
    student_ID = models.CharField(unique=True, max_length=14)
    notes = models.CharField(max_length=255, default=None, blank=True)
    enrolled = models.BooleanField(default=False)
    course = models.ManyToManyField('Course', default=None, blank=True)

class Course(models.Model):
    study_programme = models.ForeignKey('StudyProgramme', on_delete=models.CASCADE, default='')
    name = models.CharField(max_length=50, unique=True)
    ects = models.PositiveSmallIntegerField(validators=[MaxValueValidator(99)])
    description = models.TextField()
    year = models.PositiveSmallIntegerField(validators=[MaxValueValidator(99)])
    semester = models.IntegerField(choices=((1, "1"),
                                            (2, "2"),
                                            ), default=None)
    teacher1 = models.ForeignKey('TeacherData', on_delete=models.CASCADE, default=None,
                                 verbose_name="Course Teacher", related_name='%(class)s_course_teacher')
    teacher2 = models.ForeignKey('TeacherData', on_delete=models.CASCADE, default=None, null=True,
                                 verbose_name="Seminar Teacher", related_name='%(class)s_seminar_teacher')
    slug = models.SlugField(max_length=150, unique=True)

【问题讨论】:

    标签: python django django-forms django-templates


    【解决方案1】:

    为什么会有 2 个类似的问题? Need advice on implementing feature regarding Django models

    就个人而言,最好有ManyToManyField 相关课程和Course 模型中的学生。这很容易,因为在此之后,您需要做的就是加载表单并发布它。那么:

    class Course(models.Model):
        # all your fields
        students = models.ManyToManyField(StudentData)
    
    class CourseForm(forms.ModelForm):
        class Meta:
            model = Course
            fields = "__all__"
    

    默认情况下,表单中的ManyToManyFieldSelectMultiple 小部件表示。如果您更喜欢复选框:

    class CourseForm(forms.ModelForm):
            class Meta:
                model = Course
                fields = "__all__"
                widgets = {
                    'students': forms.CheckboxSelectMultiple
                }
    

    在您的模板中,只需加载表单{{form}},老师就会使用复选框选择课程中的学生。每个学生将通过使用反向ManyToManyField 关系过滤来查看课程:

    student = Student.objects.get(name='John', surname='Doe')
    courses = student.course_set.all() # These are all the courses where the student is enrolled
    

    这就是ManyToManyField 的优点。您可以从CourseForm 分配学生,并使用反向关系course_set 从学生模型访问他们。

    【讨论】:

    • 这个方法我猜也不错。但这确实是一个多选框。我只想要每个学生姓名附近的复选框.. 我该如何确认?我需要一个按钮。
    • Nvm。解决了。谢谢。
    【解决方案2】:

    您不应在ModelForm 中明确指定该字段,因为它已在模型中定义。

    class StudentDataForm(forms.ModelForm):
        class Meta:
            model = StudentData
            fields = ('enrolled', )
    

    这是表单定义。如果你想传递初始值然后实例化它像

    form = StudentDataForm(initial={'enrolled': True})
    

    它会神奇地(不是这样)创建带有最初选中enrolled 字段的ModelForm 实例。

    现在在模板中,您只需渲染此表单(您必须在模板渲染中传递表单context={'form': form}

    ...
    {{ form }}
    ...
    

    这将呈现表单,但如果您想手动呈现它,请这样做

    ...
    {{ form.enrolled }}
    ...
    

    它只会渲染复选框。请记住,您必须将其嵌套在 &lt;form&gt; 标记中,并在此处添加一个 submit 按钮。

    更多资源:

    Model Form | Django docs

    Providing initial values | Django docs

    【讨论】:

    • 这是有用的信息,但在这里并不能真正回答我的问题..
    猜你喜欢
    • 2022-12-18
    • 2014-09-05
    • 2013-01-26
    • 1970-01-01
    • 2020-03-30
    • 2011-10-11
    • 1970-01-01
    • 2019-11-30
    • 2020-06-18
    相关资源
    最近更新 更多