1

特定のobject_listの「defaultfieldname」というフィールドをフィルタリングするビューがあります。私がやりたいのは、フィールドの名前をurls.pyのパラメーターとして渡すように調整することです。これにより、フィールドごとに異なるURLを使用できるようになります。

どちらの方法が簡単かわかりません。

url(r'^calendar/birthday/$', login_required(MonthCalends.as_view(model=Person)), name='bday_list', filter_field="birthdate"),
url(r'^calendar/deathday/$', login_required(MonthCalends.as_view(model=Person)), name='dday_list', filter_field="deathdate"),

また

url(r'^calendar/birthday/$', login_required(MonthCalends.as_view(model=Person, filter_field="birthdate")), name='bday_list'),
url(r'^calendar/deathday/$', login_required(MonthCalends.as_view(model=Person, filter_field="deathdate")), name='dday_list'),

それから私は見解を持っています:

class MonthCalends(ListView):
    template_name='month_list.html'
    ## Sets default fieldname value
    filter_field = "defaultfieldname"
    ...rest of code

urls.pyのparamは、ビューの「defaultfieldname」を上書きする必要がありますが、ビューのurls.pyからfilter_fieldを取得する方法がわかりません。何か助けはありますか?

ありがとう!

4

2 に答える 2

2

送信する引数はas_view、MonthCalendsオブジェクトに設定されます。つまりfilter_field、として利用可能ですself.filter_field。メソッドを定義したとするとget、次のように実行できます。

class MonthCalends(ListView):
    template_name='month_list.html'
    ## Sets default fieldname value
    filter_field = "defaultfieldname"

    def get(self, request, *args, **kwargs):
        try:
            # if the filter field was sent as an argument
            filter_field = self.filter_field
        except:
            # else revert to default
            filter_field = MonthCalends.filter_field
        # ...rest of code

より完全な説明については、Djangoクラスベースのビューのドキュメントを確認してください。

于 2012-08-21T01:24:05.773 に答える
1

1つのURLを使用するだけで、URLの2番目の部分がトリガーされます。

url(r'^calendar/(\w+)$', login_required(MonthCalends.as_view(model=Person)), name='bday_list'),

次に、を使用してアクセスできますself.args[0]

また、に対して2つの異なるタイプを許可する場合はfilter_field、後で読んだクラスで例外を発生させることができますself.args[0]

もちろん、次のような正規表現でより読みやすい構文を使用することもできます。

r'^calendar/(?P<type>\w+)$'

この場合、を使用してアクセスできますself.kwargs['type']

とにかく、正規表現グループを使用する方がはるかに優れているようです。

于 2012-08-21T00:44:40.100 に答える