أوامر django -admin المخصصة - contributeerror: "الأمر" لا يحتوي على سمة "stdout"
-
02-10-2019 - |
سؤال
باتباع مثال كتابة أمر Django-Admin مخصص هنا, ، لقد قمت بإنشاء الأمر المخصص التالي:
from django.core.management.base import BaseCommand, CommandError
class Command(BaseCommand):
args = ''
help = 'Test command'
def handle(self, *args, **options):
self.stdout.write("Hello World!")
من المثير للدهشة ، أتلقى تتبع المكدس التالي:
Traceback (most recent call last):
File "D:\My Documents\Dev\MyProject\svn\trunk\dj_project\manage.py", line 11, in <module>
execute_manager(settings)
File "C:\Python26\lib\site-packages\django\core\management\__init__.py", line 438, in execute_manager
utility.execute()
File "C:\Python26\lib\site-packages\django\core\management\__init__.py", line 379, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Python26\lib\site-packages\django\core\management\base.py", line 191, in run_from_argv
self.execute(*args, **options.__dict__)
File "C:\Python26\lib\site-packages\django\core\management\base.py", line 218, in execute
output = self.handle(*args, **options)
File "D:\My Documents\Dev\MyProject\svn\trunk\dj_project\..\dj_project\dj_app\management\commands\mytest.py", line 8, in handle
self.stdout.write("Hello World!")
AttributeError: 'Command' object has no attribute 'stdout'
كيف ذلك؟ هذا أمر مخصص أساسي للغاية بقدر ما أفهم يتوافق مع المثال.
أنا أستخدم Django 1.2.1
المحلول
يبدو أن رسم الخرائط self.stdout
هو تغيير جديد للغاية في نسخة جذع Django ، ارتكبت في مايو. إذا كنت تقوم بتشغيل الإصدار 1.2 أو في وقت سابق ، فلن يعمل هذا - ويجب أن تستخدم الوثائق السابقة.
نصائح أخرى
نظرًا لأن هذه هي أول ضربة على Google ، سأكتب حلًا آخر لمشكلة أخرى مع نفس رسالة الخطأ: إذا كان أمر الفصل الخاص بك ينفذ __init__ ، فيجب عليه الاتصال بـ __init__ من الفئة الفائقة.
هذا سيفي بالغرض:
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def __init__(self, *args, **kwargs):
super(Command, self).__init__(*args, **kwargs)
... do stuff
هذا لن ينجح:
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def __init__(self, *args, **kwargs):
... do stuff
هناك حلولان سهلين هنا. البسيطة هي ببساطة تحويل كل ما تبذلونه self.stdout
خطوط ل print
البيانات بدلا من ذلك.
هذا حل جيد ويمكنك القيام بذلك.
الحل الأفضل ، منذ ذلك الحين self.stdout
تم إعداده في execute()
الطريقة ، هي ... تشغيل execute()
طريقة.
لذا بدلاً من:
Command().handle()
يفعل:
Command().execute()
سوف إعداد self.stdout
متغير بشكل صحيح وستكون خارج وتشغيل.