أوامر django -admin المخصصة - contributeerror: "الأمر" لا يحتوي على سمة "stdout"

StackOverflow https://stackoverflow.com/questions/3167795

  •  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 متغير بشكل صحيح وستكون خارج وتشغيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top