2

私は現在djangoプロジェクトに取り組んでいます。以下に示すように、フォーム (テンプレート) でのユーザー入力に基づいて、データベースのデータ ストアをフィルター処理する必要がありました。

ここに画像の説明を入力

フォーム ユーザーで値を入力するか、空白のままにします。したがって、最初に(有効な)ユーザー入力を見つけてから、適切なクエリを起動して、フォームにユーザー入力としてデータを表示する必要があります。したがって、最終結果はテンプレートのテーブルに表示する必要があります。

私はdjangoを初めて使用するので、複数のフィールドでデータを表すためにデータを渡してクエリを実行するにはどうすればよいですか。これらのタイプの問題に関連するヘルプまたはリンクが期待されます。(1つのフォームのみでデータベースからフィルタリングできただけで、これを解決する概念がありませんでした。)

私の一時プロジェクトのモデルは以下の通りです。

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

いくつかの方法がありますが、ここでは、フォームの投稿データに基づいて適切なフィルターを連鎖させることを含む、使用できる 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 に答える