2

我目前正在使用 django 项目。我必须根据表单上的用户输入(在模板上)过滤数据库上的数据存储,如下所示。

在此处输入图像描述

在表单上,​​用户输入值或将其留空。所以我要做的是首先找到(有效的)用户输入,然后触发适当的查询以将数据显示为表单中的用户输入。所以最终结果应该显示在模板的表格上。

由于我是 django 新手,我应该如何传递数据并触发查询来表示多个字段的数据。作为与这些类型问题相关的帮助或链接是预期的。(我只能用一种形式从数据库中过滤,并且没有解决这个问题的概念。)

我的临时项目模型如下。

class exReporter(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField()
    gender = models.CharField(max_length=1)
    age = models.IntegerField()
    label = models.IntegerField()
4

1 回答 1

1

您可以采用多种方法,但您可以使用以下一种解决方案,该解决方案涉及根据表单发布的数据将适当的过滤器链接在一起:

*注意:为了符合 Python 的命名约定,将exReporter类重命名为ExReporter

# views.py
def process_ex_reporter_form(request):
    if request.method == "POST":
        # ExReporterForm implementation details not included.
        ex_reporter_form = ExReporterForm(request.POST)

        if ex_reporter_form.is_valid():
            # If form field has no data, cleaned data should be None.
            gender = ex_reporter_form.cleaned_data['gender']
            age_start = ex_reporter_form.cleaned_data['age_start']
            age_end = ex_reporter_form.cleaned_data['age_end']
            aggregation_group = ex_reporter_form.cleaned_data['aggregation_group']
            aggregation_id = ex_reporter_form.cleaned_data['aggregation_id']

            ex_reporters = ExReporter.objects.get_ex_reporters(gender, age_start,
                               age_end, aggregation_group, aggregation_id)

        else:
            # Pass back form for correction.
            pass

    else:
        # Pass new form to user.
        pass

# models.py
class ExReporterManager(models.Manager):
    def get_ex_reporters(self, gender, age_start, age_end, aggregation_group,
                         aggregation_id):

        ex_reporters = super(ExReporterManager, self).get_query_set().all()

        # Even though the filters are being applied in separate statements,
        # database will only be hit once.
        if ex_reporters:
            if gender:
                ex_reporters = ex_reporters.filter(gender=gender)

            if age_start:
                ex_reporters = ex_reporters.filter(age__gt=age_start)

            if age_end:
                ex_reporters = ex_reporters.filter(age__lt=age_end)

            # Apply further filter logic for aggregation types supported.

        return ex_reporters
于 2013-08-17T13:10:33.897 回答