2

まず、循環Model参照ではありません。それらについて多くの答えを見つけることができました。

設定でリマインダーを簡単に定義できるアプリを作成しています。したがって、REMINDERS設定は次のようになります。

設定

REMINDERS = [
    {
        'reminder_id': 'my-id',
        'reminder_class': 'students.reminders.ExpiredAvailabilityEmailReminder',
    },
]

このアプリ ( reminders) では、これらのリマインダーの基本クラスを提供します。これには、いくつかの既定の動作があります。リマインダーを定義するには、たとえば、次のことだけを行う必要があります。

students_app/reminders.py

from reminders.base_reminders import ReminderEmail
from .models import Student


class ExpiredAvailabilityEmailReminder(ReminderEmail):
    template_name = 'students/emails/setting_expired.html'

    def get_queryset(self):
        return Student.objects.filter(
                    is_active=True,
                    setting_expired__lt=datetime.date.today())

リマインダーアプリ/管理/コマンド/send_reminders.py

管理コマンドは、このreminder_class-string を でhandleインポートdjango.utils.module_loading.import_by_pathしますが、これは次のエラーで失敗します:

django.core.exceptions.ImproperlyConfigured: Error importing module studenten.reminders: "No module named base_reminders"

循環参照になるからです。この問題に遭遇することなく、アプリのユーザーにサブクラス化可能な基本クラスを提供するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

1

この問題は、Python 2 のデフォルトのインポート順序に関連しています。モジュールがそれ自体を参照しているのか、リマインダーとも呼ばれるアプリを参照しているのかが明確ではありませんstudents_app/reminders.py。これを修正するには、Python 2.5+ で使用できます (または、これがデフォルトである Python 3 を使用します)。from reminders.base_reminders import ReminderEmailremindersfrom __future__ import absolute_import

from __future__ import absolute_import
from reminders.base_reminders import ReminderEmail

これにより、remindersインポートで相対モジュールremindersではなくアプリが使用されるようになります。reminders

remindersもう 1 つの修正は、この命名の競合を避けるためにモジュールに名前を付けることを人々に奨励しないという文書化の修正です。

于 2013-09-25T13:47:55.757 に答える