【问题标题】:Is there a way to filter data when passing it in ModelForm and how can we edit them?有没有办法在 ModelForm 中传递数据时过滤数据,我们如何编辑它们?
【发布时间】:2019-10-15 08:44:35
【问题描述】:

我正在创建一个网站来注册学生。所以基本上分为3部分

1. A student register model which take the name, fathername, etc of student.
2. A student fee model which use foreignkey to get register student.
3. ModelForm for showing student fee model to enter data.

现在的问题是,如果我想填写第 1 班的学生费用,它会显示其他班级的所有学生,但我希望学生根据他们的班级和姓名显示过滤器,并在他们面前显示可编辑的费用和待定费用表格。

通过一些接触,我了解了 ModelForm 实例,我编写了用于自动将注册学生添加到学生费用中的代码。

def student_fee(request):
    # add a selection field to a variable for filtering student_class below this.
    students = StudentRegister.objects.filter(student_class="1")
    ....
    for x in students:
        if not  StudentFee.objects.filter(student=x):
            StudentFee.objects.create(student=x, fee=0, pending_fee=0)

但是对于instance,我必须知道每个学生的主键,我可以遍历它们,但它只能获取最后一个元素。

models.py

class StudentRegister(models.Model):
    student_image    =      models.ImageField(upload_to="register_student", blank=True)
    student_class    =      models.CharField(max_length=2, choices=STUDENT_CLASS, default="1")
    mobile_number    =      models.CharField(max_length=50)
    student_name     =      models.CharField(max_length=50)
    father_name      =      models.CharField(max_length=50)
    mother_name      =      models.CharField(max_length=50)
    address          =      models.CharField(max_length=200)
    student_fee      =      models.CharField(max_length=10, default="0")
    Date_Of_Birth    =      models.DateField(auto_now=False)
    admission_fee    =      models.CharField(max_length=10)
    Admission_date   =      models.DateField(auto_now=False)
    adhaar_no        =      models.CharField(max_length=100)

    def __str__(self):
        return "%s  class: %s" % (self.student_name, self.student_class)


class StudentFee(models.Model):
    student = models.ForeignKey(StudentRegister, on_delete=models.CASCADE)
    fee = models.CharField(max_length=20)
    pending_fee = models.CharField(max_length=20)

    def __str__(self):
        return "%s " % (self.student)

forms.py

class StudentFeeForm(forms.ModelForm):
    class Meta:
        model = StudentFee
        fields = '__all__'

views.py(很抱歉)

def student_fee(request):
    # add a selection field to a variable for filtering student_class below this.
    students = StudentRegister.objects.filter(student_class="1")
    real = StudentFee.objects.all()
    # student_form = StudentFeeForm(request.POST or None)
    student_form = StudentFeeForm(request.POST)#, instance=students)
    # print(dir(students))
    q = (students.get(pk=1))
    global list_student_pk
    list_student_pk = []
    for x in students:
        list_student_pk.append(x.pk)
    student_get_instance = StudentFeeForm(instance=q)
    # print(student_get_instance)

    # This thing done don't touch----------------------------------
    for x in students:
        if not StudentFee.objects.filter(student=x):
            StudentFee.objects.create(student=x, fee=0, pending_fee=0)

    if request.method == "POST":
        if student_form.is_valid():
            pass # this thing will done after the form problem solved.
    # till here ==========================================================

    return render(request, "student_fee_home.html", {"students": students, "real":real, "student_form":student_form, "list_student_pk":list_student_pk, "student_get_instance":student_get_instance})

我希望 modelforms 根据类过滤。 然后可以编辑已经注册学生的学生费用模型(学生姓名,费用,待定费用)。这样它就可以在他面前显示学生姓名和可编辑的费用表和待处理的费用表。

它现在像这样显示所有班级的所有学生,但我希望显示学生姓名而不是选择字段。据我所知,唯一的选择是直接从模型中显示学生显示名称的名称,然后使用表单输入费用和待处理费用,然后在模型中创建它。

【问题讨论】:

  • 你没有告诉我们什么是行不通的。你有错误吗?哪些行为不是您所期望的?
  • 我想要一个模型表来显示学生姓名(过滤器)以及可编辑的费用和待定费用表。

标签: python django database django-models django-forms


【解决方案1】:

djang0-filter 会帮你过滤

pip install django-filter

模型.py

    class Dispatcher(models.Model):
        _safedelete_policy = SOFT_DELETE

        Individual = 'Individual'
        Company = 'Company'

        TYPES = [
            (Individual, 'Individual'),
            (Company, 'Company')
        ]
    type = models.CharField(max_length=255,
                                choices=TYPES,
                                default=Individual)

Views.py

class DispatcherViewSet(viewsets.ModelViewSet):
    queryset = Dispatcher.objects.all()
    serializer_class = DispatcherSerializer
    filter_backends = (DjangoFilterBackend,)
    filterset_fields = ['type']

【讨论】:

  • 好的过滤器问题解决了,但是如果我一个班有 60 名学生,从选择字段中选择每个学生会很痛苦。我怎样才能在他们面前显示他们的名字和他们的领域?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多